您的位置:首页 > 产品设计 > UI/UE

uva1594 Ducci Sequence 习题5-2 (STL map练习)

2015-01-02 18:20 323 查看
题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=4469

题意:输入n个数,a1,a1,a2....an,进行1000次计算:(a1,a2,...,an) 

 (| a1 - a2|,| a2 - a3|, ... ,| an - a1|),判断是否存在重复
或者都为0.

参考博客:http://www.cnblogs.com/shinecheng/p/4031981.html  感谢ShineCheng

这是第一次写的代码,比较乱,仔细看了看ShineCheng的代码,又写了一次

<span style="font-size:18px;">#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
struct node{
int n;
int a[16];

bool operator < (const node &b) const{
for(int i=0;i<n;i++)
if(a[i]!=b.a[i]) return a[i]<b.a[i];
return false;
}
}p;

map<node,int> vis;
int main(){
int T;
cin >> T;
while(T--){
vis.clear();
cin >> p.n;
for(int i=0;i<p.n;i++)
cin >> p.a[i];
vis[p]=1;

int flag=1;//标志是否已经输出ZERO或者LOOP

for(int i=0;i<1010;i++){
int tot=0;
int rem=p.a[0];
for(int j=0;j<p.n-1;j++){
p.a[j]=abs(p.a[j]-p.a[j+1]);
if(p.a[j]==0) tot++;
}
p.a[p.n-1]=abs(p.a[p.n-1]-rem);
if(p.a[p.n-1]==0) tot++;

if(vis[p]==1 || tot==p.n){
if(tot==p.n) cout << "ZERO\n";
else         cout << "LOOP\n";
flag=0;
break;
}
vis[p]=1;
}
if(flag ) cout << "LOOP\n";
}
return 0;
}</span>


第二次写的代码:

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
struct node{
int n;
int a[16];
void read(){
for(int i=0;i<n;i++)
cin >> a[i];
}
void ducci(){
int tmp=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]-tmp);
}
int tot(){
for(int i=0;i<n;i++)
if(a[i]!=0) return 0;
return 1;
}
bool operator < (const node &b) const{
for(int i=0;i<n;i++)
if(a[i]!=b.a[i]) return a[i]<b.a[i];
return false;
}
}p;

map<node,int> vis;
int main(){
int T;
cin >> T;
while(T--){
vis.clear();
cin >> p.n;
p.read();

int flag=0;//标志是否已经输出ZERO或者LOOP

for(int i=0;i<1010;i++){
if(vis[p]==1 || p.tot()){
flag=1;
if(vis[p]) cout << "LOOP\n";
else       cout << "ZERO\n";
break;
}
vis[p]=1;
p.ducci();
}
if(flag==0) cout <<"LOOP\n";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: