没什么技巧性的一题, 主要是用map给每一个状态的N元组记录一下, 然后transform,
如果transfrorm之后的被记录过了, 说明回到了原来的状态, LOOP,
如果某次transform之后全为0了也结束循环
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <deque>
#include <map>
#include <cassert>
#include <iomanip>
using namespace std;
const int MAXN = 1410;
typedef long long LL;
/*
uva 1594
*/
vector<int> vec(16),tmp(16);
map<vector<int>,int> old;
int main(){
// freopen("input2.txt","r",stdin);
int N, Case;
cin >> Case;
while( Case-- ){
scanf("%d",&N);
old.clear();
vec.clear();
bool allZero = true;
for(int i=0; i<N; i++){
cin >> vec[i];
if( vec[i]!=0 ) allZero = false;
}
while( old[vec]==0 && !allZero ){
old[vec] = 1;
allZero = true;
// tmp.clear();
for(int i=0; i<N; i++){
tmp[i] = abs(vec[i]-vec[i+1]);
if( i==N-1 ) tmp[i] = abs(vec[N-1]-vec[0]);
if( tmp[i]!=0 ) allZero = false;
}
vec = tmp;
// for(int i=0; i<N; i++){
// cout << vec[i] << " ";
// }
// cout << endl;
}
if( allZero ){
cout << "ZERO" << endl;
}else{
cout << "LOOP" << endl;
}
}
return 0;
}
本文介绍了一个解决UVA1594问题的方法,通过使用map来记录每种状态的变化过程,当状态重复出现或者所有元素变为0时终止循环,实现对问题的有效求解。

675

被折叠的 条评论
为什么被折叠?



