一.题目
题目链接:Uva1594
二.思路
用vector保存每个元组里面的元素,判断一个元组是否归0的方法:用一个flag计算当前状态下的元组的0的个数,如果0的个数等于元组里元素的个数,则说明当前元组是ZERO,跳出循环,如果直到1000次还没跳出循环,则说明是LOOP型的。详细的请看代码注释。
三.源代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
int n = 0, n2 = 0, m = 0, temp = 0, flag = 0, k = 0;
cin >> n;
n2 = n; //记录n的值用于循环的处理,其实可以优化把2个大的while循环合并成一个
vector<int> tuple[n + 5]; //vector保存每一个元组
while (n2--) {
cin >> m;
for (int i = 0; i < m; i++) {
cin >> temp;
tuple[n2].push_back(temp);
}
}
while (n--) {
m = tuple[n].size(); //记录当前元组的元素个数,也可以不记录,用vector的迭代器
while ((k++) < 1000) {
temp = tuple[n][0]; //这里要特别注意,因此是用前一个数减后一个数,如果不先保存第一个数的结果
for (int i = 0; i < m; i++) { //在最后一个数减第一个数的时候,这时候的第一个数的值不再是原本的那个值
if (i == m - 1)
tuple[n][i] = abs(tuple[n][i] - temp);
else
tuple[n][i] = abs(tuple[n][i] - tuple[n][i + 1]);
if (tuple[n][i] == 0)
flag++; //记录当前元组中0元素的个数
}
if (flag == m) //如果个数等于元组的元素数目,说明是ZERO型的,跳出循环
break;
else
flag = 0;
}
if (flag == m)
cout << "ZERO" << endl;
else
cout << "LOOP"<<endl;
// if ((flag == m) && (n != 0))
// cout << "ZERO" << endl;
// if ((flag == m) && (n == 0))
// cout << "ZERO";
// if ((flag != m) && (n != 0))
// cout << "LOOP" << endl;
// if ((flag != m) && (n == 0))
// cout << "LOOP";
k = 0; //每一次循环结束记得将循环次数k和0元素个数标识重置
flag = 0;;
}
return 0;
}