- 题目
题目描述
将n个数排成一个圆圈,每一轮我们进行下面的操作,每个数与自己顺时钟方向的下一个数差的绝对值作为新一轮的数。
经过若干轮后,这些数可能全部都变成0。比如{2,3,4,5}→{1,1,1,3}→{0,0,2,2}→{0,2,0,2}→{2,2,2,2}→{0,0,0,0},经过5轮得到全是0。
请写一个程序,判断一下给定的数圈是否能在不超过1000轮之内,迭代变成全0。
输入
第一行是一个整数T(1≤T≤1000)表示样例的个数。
每个样例的第一行是整数n(2≤n≤15),表示圈中数的个数。
每个样例的第二行是n个整数,ai,0≤ai≤1000,i=1,2,…,n。
输出
每行输出一个样例的结果,如果不可能变成全0,输出“Impossible”;否则,输出迭代的轮次。
样例输入
2
4
2 3 4 5
3
1 3 5
样例输出
5
Impossible
- 解法
题目说了1000次以内没有达到目标则输出impossible,所以直接暴力试就OK了。我的代码如下。
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
int check(int a[], int n) {
int sum = 0;
for(int i = 0; i < n; i++) {
sum += a[i];
}
return sum;
}
int main(int argc, char const **argv) {
int T, a[20], n, cnt;
cin >> T;
while(T--) {
bool flag = false;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
for(int i = 0; i < 1000; i++) {
int temp = a[0];
for(int j = 0; j < n-1; j++) {
a[j] = abs(a[j]-a[j+1]);
}
a[n-1] = abs(a[n-1]-temp);
if(check(a, n) == 0) {
flag = true;
cnt = i;
break;
}
}
if(flag) {
cout << cnt+1 << endl;
} else {
cout << "Impossible" << endl;
}
}
return 0;
}