题意如下:
对于一个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或者循环。
下面展示C++程序
#include<set>
#include<vector>
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
#define _for(i,a,b) for(int i = a ; i < b ; i ++ ) // 宏定义
// 封装输入函数
int readint() {
int x;
scanf("%d",&x);
return x;
}
int main(){
int T = readint(); // 输入序列个数
vector<int> seq ,zeroSeq;
set< vector<int> > seqs;
while(T -- ){
int n = readint(); // 输入序列长度
seq.clear();
zeroSeq.resize(n); // 分配大小以及初始值默认为 0
_for(i,0,n) seq.push_back(readint()); // 输入序列
seqs.clear(),seqs.insert(seq);
while(true){
if(seq == zeroSeq)
{
puts("ZERO");
break;
}
int temp = seq[0];
_for(i,0,n)
{
if(i == n-1)
seq[i] = abs(seq[i] - temp);
else
seq[i] = abs(seq[i] - seq[i+1]);
}
if (seqs.count(seq)){ // 判断是否有重复序列
puts("LOOP");
break;
}
seqs.insert(seq); // 加入不重复序列集合
}
}
return 0;
}
显示结果:
参考:算法竞赛入门经典习题与解答 陈锋 编著