Ducci Sequence UVA - 1594 Ducci序列 模拟

题目链接

对于一个n元组(a1, a2, …, an),可以对于每个数求出它和下一个数的差的绝对值,得到一个新的n元组(|a1-a2|, |a2-a3|, …, |an-a1|)。重复这个过程,得到的序列称为Ducci序列,例如:(8, 11, 2, 7) -> (3, 9, 5, 1) -> (6, 4, 4, 2) -> (2, 0, 2, 4) -> (2, 2, 2, 2) -> (0, 0, 0, 0).也有的Ducci序列最终会循环。输入n元组(3≤n≤15),你的任务是判断它最终会变成0还是会循环。输入保证最多1000步就会变成0或者循环。 

#include 
#include 
#include 
#include 
using namespace std;
const int N = 20, MAXN = 1000;
int a[N], b[N];

bool check(int n){
	for(int i = 0; i < n; i++)
	 	if(a[i]) return false;
	return true;
}

bool solve(int n){
	for(int i = 0; i < MAXN; i++){
		memcpy(b,a,sizeof(a));
		for(int j = 0; j < n-1; j++)
			a[j] = abs(b[j] - b[j+1]);
		a[n-1] = abs(b[0] - b[n-1]);		
		if(check(n)) return true;
	}
	return false;
} 

int main(int argc, char** argv) {
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		for(int i = 0; i < n; i++)
			scanf("%d",&a[i]); 
		if( solve(n)) printf("ZERO\n");			
		else printf("LOOP\n");
	}
	return 0;
}

 

你可能感兴趣的:(算法竞赛入门经典(第二版))