uva 1594

本文介绍了一个解决UVA1594问题的方法,通过使用map来记录每种状态的变化过程,当状态重复出现或者所有元素变为0时终止循环,实现对问题的有效求解。

原题

没什么技巧性的一题, 主要是用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; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值