Uva 1594

来源:互联网 发布:通过itunes安装软件 编辑:程序博客网 时间:2024/06/05 17:49

一.题目

题目链接: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;}