CE搞得有点自闭,我是真的不知道格式错哪儿了
先说算法:就是把串放进集合之前,判断集合中是否有一样的元素,如果有就loop,没有就放进去,当然还要判断串和全0的串是不是一样,一样的话就zero。很简单,上源码
#include <string>
#include <set>
#include <cmath>
#include <iostream>
#include <sstream>
#include <cstring>
using namespace std;
#define maxn 20
int s[maxn];
int ss[maxn];
char sss[maxn];
string ssss;
set<string> a;
void change(int *aa,int mm)
{
stringstream pp;
for(int i=0;i<mm;i++)
{
pp<<aa[i];
ssss=pp.str();
}
}
int main()
{
int n=0;int m=0;
cin>>n;
while(n--)
{
cin>>m;int i=0;int mm=0;
mm=m;
while(m--)
{
cin>>s[i];
i++;
}
change(s,mm);//转换成字符串存在集合里面
a.insert(ssss);
for(int i=0;i<mm;i++)
{
sss[i]='0';
}
while(1)
{
for(int i=0;i<mm;i++)
{
if(i!=mm-1) ss[i]=abs(s[i]-s[i+1]);
if(i==mm-1) ss[i]=abs(s[i]-s[0]);
}
change(ss,mm);//转换成字符串存在集合里面
memcpy(s,ss,sizeof(ss));
if(ssss==sss) {cout<<"ZERO"<<endl;break;}
if(find(a.begin(),a.end(),ssss)==a.end()) {a.insert(ssss);}
else {cout<<"LOOP"<<endl;break;}
}
}
return 0;
}
注意几个地方:
1、整型数组转成string:
void change(int *aa,int mm)
{
stringstream pp;
for(int i=0;i<mm;i++)
{
pp<<aa[i];
ssss=pp.str();
}
}
流转化,如果aa包含元素有:8,11,2,7那么ssss的变化过程为:
8,811,8112,81127,是一个累积的过程。
转换成string型后放进集合:
a.insert(ssss);
2、string是可以和char[maxn]比较的
char sss[maxn];
string ssss;
for(int i=0;i<mm;i++)
{
sss[i]='0';
}
if(ssss==sss) {cout<<"ZERO"<<endl;break;}
3、在set中找匹配的元素
if(find(a.begin(),a.end(),ssss)==a.end()) {a.insert(ssss);}
else {cout<<"LOOP"<<endl;break;}
else的那一部分表示找到了
4、整型数组拷贝
memcpy(s,ss,sizeof(ss));
整型数组s和ss的大小相同,将ss的内容拷贝到了s上面,在cstring头文件里