紫书刷题记录:UVa1594,Ducci序列;

本题难度不大,思路也很清晰:元组大小不确定,设置为vector;建立一个集合,集合里每一个元素就是一个元组,每次计算完元组后先判断LOOP
or ZERO,如果成立直接退出,否则插入新元组

#include
#include
#include
#include
#include
using namespace std;
int main()
{
   int t;
   cin>>t;
   set<vector<int> >st;//每个集合是一个容器,代表元组,因为题目中所给元组大小不确定,故考虑vector当元组 
   while(t--)
   {
   	    st.clear();//因为重复输出,需要清空; 
   	    int n;
   	    cin>>n;
   	    vector<int>a,b,pd;//a代表第一个元组,b负责更新元组,pd特判zero; 
   	    int num;
   	    for(int i=0;i<n;i++)//pd初始化; 
   	    pd.push_back(0); 
   	    for(int i=0;i<n;i++)
   	    {
   	    	cin>>num;
   	    	a.push_back(num);
		}
		b=a;
		for(;;)
		{
			vector<int>k;//临时元组; 
			for(int i=0;i<n;i++)
			{
				if(i==n-1)
				k.push_back(abs(b[i]-b[0]));
				else
				k.push_back(abs(b[i]-b[i+1]));
			}
			if(k==pd)//这里要放在前面,因为考虑到输入0 0 0 0,此情况是zero也是loop,但根据题目zero优先级高; 
			{
				cout<<"ZERO"<<endl;
				break;
			}
			if(st.count(k))//如果出现过该元组; 
			{
				cout<<"LOOP"<<endl;
				break;
		    }
		    b=k;//更新 
		    st.insert(b);//插入元组; 
		}
   }
   return 0;
} 

你可能感兴趣的:(紫书刷题记录,c++,算法)