从一个编程网站上搞过来的题目,自己解了一下,发现就是类似于字符串旋转的问题:
题目描述:
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
给出解答:
#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;
}