從一個編程網站上搞過來的題目,自己解了一下,發現就是類似於字符串旋轉的問題:
題目描述:
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;
}