问题不在赘述,放上原文链接,https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4469
注意:在前两个数作差求绝对值以后,数组第一个数被改写,因此在每次作差操作前,要保存第一个数,防止出错
#include <iostream>
#include <vector>
#include <map>
#include <math.h>
using namespace std;
typedef vector<int> V;
map<V,int> ID;
V v;
bool find_id(V &v){
if( !ID.count(v) ){
ID[v] = (int)(ID.size() - 1);
return false;
}
return true;
}
int main(){
int x;
int n;
cin >> n;
while(n--){
int t;
cin >> t;
v.clear(); // 每一次数据都要清空vector 和 map
ID.clear();
while(t--){
cin >> x;
v.push_back(x);
}
int len = (int)v.size();
v.push_back(v[0]); // 因为最后一个数要与第一个数作差,这里增加一个空间存放第一个数,同时避免j+1越界。
while(true){
int sum = 0;
v[len] = v[0];
for(int j = 0; j < len ; j++){
sum += v[j];
v[j] = abs(v[j] - v[j+1]);
}
if(sum == 0){ // sum得0,表示每个数都是0,退出循环
cout << "ZERO"<< endl;
break;
}
if(find_id(v)){ // ID为已存在的,是循环。
cout << "LOOP" << endl;
break;
}
}
}
return 0;
}