解题思路:在减数时,注意第n个减第1个前,第1个数已经改变了,所以别忘了保存第一个数的原值.我就在这耽搁了不少时间。
解题代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<sstream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,a[16];
int Map[1001][16];
void change(){
int s=-1;
for(int i=0;i<n;i++){
if(i==0) s=a[i];
if(i==n-1) a[i]=abs(a[i]-s);
else a[i]=abs(a[i]-a[i+1]);
}
}
bool zero(){
for(int i=0;i<n;i++){
if(a[i]!=0)return false;
}
return true;
}
void save(int num){
for(int i=0;i<n;i++){
Map[num][i]=a[i];
}
}
bool Is_same(int num){
for(int i=0;i<=num;i++){
int j;
for(j=0;j<n;j++){
if(a[j]!=Map[i][j])break;
}
if(j==n) return true;
}
return false;
}
void print(){
cout<<"------------------"<<endl;
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
cout<<"------------------"<<endl;
}
int main(){
cin>>T;
while(T--){
cin>>n;
memset(a,-1,sizeof(a));
memset(Map,-1,sizeof(Map));
for(int i=0;i<n;i++) cin>>a[i];
int flag=-1;
int num=0;
while(num<1000){
if(zero()){
flag=0;
break;
}
//print();
save(num);
change();
//print();
if(Is_same(num)&&!zero()){
flag=1;
break;
}
num++;
}
if(flag==0){
cout<<"ZERO"<<endl;
}
if(flag==1){
cout<<"LOOP"<<endl;
}
}
return 0;
}