题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4469
Time limit: 3.000 seconds

Description

A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1, a2, · · · , an),
the next n-tuple in the sequence is formed by taking the absolute differences of neighboring integers:

(a1, a2, · · · , an) → (|a1 − a2|, |a2 − a3|, · · · , |an − a1|)

Ducci sequences either reach a tuple of zeros or fall into a periodic loop. For example, the 4-tuple
sequence starting with 8,11,2,7 takes 5 steps to reach the zeros tuple:

(8, 11, 2, 7) → (3, 9, 5, 1) → (6, 4, 4, 2) → (2, 0, 2, 4) → (2, 2, 2, 2) → (0, 0, 0, 0).

The 5-tuple sequence starting with 4,2,0,2,0 enters a loop after 2 steps:

(4, 2, 0, 2, 0) → (2, 2, 2, 2, 4) → (0,0,0,2,2) → (0, 0, 2, 0, 2) → (0, 2, 2, 2, 2) → (2, 0, 0, 0, 2) →
(2, 0, 0, 2, 0) → (2, 0, 2, 2, 2) → (2, 2, 0, 0, 0) → (0, 2, 0, 0, 2) → (2, 2, 0, 2, 2) → (0, 2, 2, 0, 0) →
(2, 0, 2, 0, 0) → (2, 2, 2, 0, 2) → (0, 0, 2, 2, 0) → (0, 2, 0, 2, 0) → (2, 2, 2, 2, 0) → (0,0,0,2,2) → · · ·

Given an n-tuple of integers, write a program to decide if the sequence is reaching to a zeros tuple
or a periodic loop.

Input

Your program is to read the input from standard input. The input consists of T test cases. The number
of test cases T is given in the first line of the input. Each test case starts with a line containing an
integer n (3 ≤ n ≤ 15), which represents the size of a tuple in the Ducci sequences. In the following
line, n integers are given which represents the n-tuple of integers. The range of integers are from 0 to
1,000. You may assume that the maximum number of steps of a Ducci sequence reaching zeros tuple
or making a loop does not exceed 1,000.

Output

Your program is to write to standard output. Print exactly one line for each test case. Print ‘LOOP’ if
the Ducci sequence falls into a periodic loop, print ‘ZERO’ if the Ducci sequence reaches to a zeros tuple.

Sample Input

4
4
8 11 2 7
5
4 2 0 2 0
7
0 0 0 0 0 0 0
6
1 2 3 1 2 3

Sample Output

ZERO
LOOP
ZERO
LOOP

Problem solving report:

Description: 判断序列经过有限次变化,是否会全部变成0或者重复出现。
Problem solving: 序列放在STL向量中,出现过的序列放入STL集合中用来判断是否出现循环。

Accepted Code:

#include <bits/stdc++.h>
using namespace std;
int main() {
    int t, n, a;
    scanf("%d", &t);
    while (t--) {
        scanf("%d", &n);
        vector <int> p, q;
        set <vector <int> > spt;
        for (int i = 0; i < n; i++) {
            scanf("%d", &a);
            p.push_back(a);
            q.push_back(0);
        }
        spt.insert(p);
        while (true) {
            if (p == q) {
                printf("ZERO\n");
                break;
            }
            p.push_back(p[0]);
            for (int i = 0; i < n; i++)
                p[i] = abs(p[i] - p[i + 1]);
            p.erase(p.begin() + n);
            if (spt.count(p)) {
                printf("LOOP\n");
                break;
            }
            spt.insert(p);
        }
    }
    return 0;
}