您的位置:首页 > 其它

Uva 1594 模拟

2016-06-28 09:21 260 查看


Ducci Sequence


Description

A Ducci sequence is a sequence of n-tuples
of integers. Given ann-tuple of integers (a1,a2, ... , an),
the nextn-tuple in the sequence is formed by taking the absolute differences of neighboring
integers:

(a1, a2, ..., an)

(|a1 - a2|,| a2 - a3|, ...,| an - a1|)Ducci
sequences either reach a tuple of zeros or fall into a periodic loop. For example, the 4-tuple sequence starting with 8,11,2,7 takes 5 steps to reach the zeros tuple:

(8, 11, 2, 7)

(3,
9, 5, 1)

(6,
4, 4, 2)

(2,
0, 2, 4)

(2,
2, 2, 2)

(0,
0, 0, 0).The 5-tuple sequence starting with 4,2,0,2,0 enters a loop after 2 steps:

(4, 2, 0, 2, 0)

(2,
2, 2, 2, 4)

(0,
0, 0, 2, 2)

(0,
0, 2, 0, 2)

(0,
2, 2, 2, 2)

(2,
0, 0, 0, 2)


(2, 0, 0, 2, 0)

(2,
0, 2, 2, 2)

(2,
2, 0, 0, 0)

(0,
2, 0, 0, 2)

(2,
2, 0, 2, 2)

(0,
2, 2, 0, 0)


(2, 0, 2, 0, 0)

(2,
2, 2, 0, 2)

(0,
0, 2, 2, 0)

(0,
2, 0, 2, 0)

(2,
2, 2, 2, 0)

(0,
0, 0, 2, 2)

... Given
an n-tuple of integers, write a program to decide if the sequence is reaching to a zeros tuple
or a periodic loop.


Input

Your program is to read the input from standard input. The input consists ofT test
cases. The number of test cases T is given in the first line of the input. Each test case
starts with a line containing an integern (3

n

15),
which represents the size of a tuple in the Ducci sequences. In the following line,n integers
are given which represents the n-tuple of integers. The range of integers are from 0 to 1,000.
You may assume that the maximum number of steps of a Ducci sequence reaching zeros tuple or making a loop does not exceed 1,000.


Output

Your program is to write to standard output. Print exactly one line for each test case. Print `LOOP'
if the Ducci sequence falls into a periodic loop, print `ZERO' if the Ducci sequence reaches to a zeros tuple.The following
shows sample input and output for four test cases.


Sample Input

4 4 8 11 2 7 5 4 2 0 2 0 7 0 0 0 0 0 0 0 6 1 2 3 1 2 3



Sample Output

ZERO LOOP ZERO LOOP


题意:

对于一个n元组(a0,a1,...),一次变换后变成(|a0-a1|,|a1-a2|,...)

问1000次变换以内是否存在循环。

思路:

模拟,map判重
#include <iostream>
#include <cstdio>
#include <map>
#include <cmath>
using namespace std;

int main()
{
int t;
cin>>t;
while(t--){
map<string,bool> flag;
int n;
cin>>n;
string ans;
for(int i=0;i<n;i++){
ans+='0';
ans+=',';
}
//cout<<ans<<endl;
int a[20];
for(int i=0;i<n;i++)
cin>>a[i];
while(1){
string str;
for(int i=0;i<n;i++){
char temp[20];
sprintf(temp,"%d",a[i]);
string te=temp;
str+=te;
str+=',';
}
if(str==ans){
cout<<"ZERO"<<endl;
break;
}
if(flag[str]){
cout<<"LOOP"<<endl;
break;
}
flag[str]=1;
int tem=a[0];
for(int i=0;i<n-1;i++)
a[i]=abs(a[i]-a[i+1]);
a[n-1]=abs(a[n-1]-tem);
// cout<<str<<endl;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: