程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 快捷鍵的難題

快捷鍵的難題

編輯:C++入門知識

從一個編程網站上搞過來的題目,自己解了一下,發現就是類似於字符串旋轉的問題:

題目描述:
Windows 7系統有很多的快捷鍵,Y同學最喜歡的快捷鍵就是Alt+Tab組合鍵,可以進行方便的進行多窗口之間的切換。為了方便,去掉一些復雜規則後,Y同學進行了如下定義。
1.窗口隊列:w1,w2,……wi……wn, (1<=i<=n, n為窗口數目)。隊首w1表示當前為激活狀態的窗口。
2.一次切換動作switch(x):
(1)按住Alt鍵不放
(2)敲擊x次Tab鍵
(3)放開Alt鍵
3.一次切換動作switch(x)產生的影響:舉例說明
(1)窗口隊列 1,2,3,4,5,6 經過switch(1)之後,成為2,1,3,4,5,6
(2)窗口隊列 1,2,3,4,5,6 經過switch(2)之後,成為3,1,2,4,5,6
(3)窗口隊列 1,2,3,4,5,6 經過switch(5)之後,成為6,1,2,3,4,5
(4)窗口隊列 1,2,3,4,5,6 經過switch(6)之後,成為1,2,3,4,5,6
(5)窗口隊列 1,2,3,4,5,6 經過switch(8)之後,成為3,1,2,4,5,6
那麼Y同學想知道,對於初始窗口隊列(1,2,3……n)進行多次switch(x)切換之後,當前激活窗口的ID是多少?請你幫助他解決這個問題。
輸入:
第一行為一個正整數:T(T<30)。T表示有多少組測試數據
每一組測試數據
第一行:n m。(0,n表示窗口隊列的長度,m表示有m次switch操作。
第二行:m個正整數x1,x2,……,xi,……xm。表示第i次進行switch(xi)操作;
輸出:
對於每組數據,輸出經過m次switch操作之後,當前激活窗口的ID。
樣例輸入:
2
6 2
3 8
8 3
4 3 14
樣例輸出:
2
7

 

 

給出解答:


[cpp]
#include<iostream>  
using namespace std; 
 
void swap(int &a, int &b) { 
    b ^= a; 
    a ^= b; 
    b ^= a; 

 
void exchange(int *start, int *end) { 
    while (start < end) { 
        swap(*start, *end); 
        start++; 
        end--; 
    } 

 
void blockExchange(int arr[], int low, int mid, int high) { 
    exchange(arr + low, arr + mid); 
    exchange(arr + mid + 1, arr + high); 
    exchange(arr + low, arr + high); 

 
int main(int argc, char *argv[]) { 
    int i; 
    int ntimes; 
    int *rst; 
    cin >> ntimes; 
    rst = new int[ntimes]; 
    int count = 0; 
    while (count < ntimes) { 
        int n, m; 
        cin >> n >> m; 
        int *arr = new int[n]; 
        for (i = 0; i < n; i++) 
            arr[i] = i + 1; 
        int *sw = new int[m]; 
        for (i = 0; i < m; i++) 
            cin >> sw[i]; 
        for (i = 0; i < m; i++) { 
            int temp = sw[i] % n; 
            blockExchange(arr, 0, temp - 1, temp); 
        } 
        rst[count++] = arr[0]; 
        delete []arr; 
        delete []sw; 
    } 
    for (i = 0; i < ntimes; i++) 
        cout << rst[i] << endl; 
    delete []rst; 
    cin.get(); 
    cin.get(); 
    return 0; 

#include<iostream>
using namespace std;

void swap(int &a, int &b) {
 b ^= a;
 a ^= b;
 b ^= a;
}

void exchange(int *start, int *end) {
 while (start < end) {
  swap(*start, *end);
  start++;
  end--;
 }
}

void blockExchange(int arr[], int low, int mid, int high) {
 exchange(arr + low, arr + mid);
 exchange(arr + mid + 1, arr + high);
 exchange(arr + low, arr + high);
}

int main(int argc, char *argv[]) {
 int i;
 int ntimes;
 int *rst;
 cin >> ntimes;
 rst = new int[ntimes];
 int count = 0;
 while (count < ntimes) {
  int n, m;
  cin >> n >> m;
  int *arr = new int[n];
  for (i = 0; i < n; i++)
   arr[i] = i + 1;
  int *sw = new int[m];
  for (i = 0; i < m; i++)
   cin >> sw[i];
  for (i = 0; i < m; i++) {
   int temp = sw[i] % n;
   blockExchange(arr, 0, temp - 1, temp);
  }
  rst[count++] = arr[0];
  delete []arr;
  delete []sw;
 }
 for (i = 0; i < ntimes; i++)
  cout << rst[i] << endl;
 delete []rst;
 cin.get();
 cin.get();
 return 0;
}

 

 \
 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved