您的位置:首页 > 其它

ZOJ 1028 Flip and Shift

2015-05-03 08:49 363 查看
Flip and Shift

Time Limit: 2 Seconds
Memory Limit: 65536 KB

This puzzle consists of a random sequence of m black disks and n white disks on an oval-shaped track, with a turnstile capable of flipping (i.e., reversing) three consecutive disks. In Figure 1, there are 8 black disks and 10 white disks
on the track. You may spin the turnstile to flip the three disks in it or shift one position clockwise for each of the disks on the track (Figure 1).



Figure 1. A flip and a shift

The goal of this puzzle is to gather the disks of the same color in adjacent positions using flips and shifts. (Figure 2)



Figure 2. A goal sequence

You are to write a program which decides whether a given sequence can reach a goal or not. If a goal is reachable, then write a message ��YES��; otherwise, write a message ��NO��.

Input

The input consists of T test cases. The number of test cases ) (T is given in the first line of the input. Each of the next T lines gives a test case. A test case consists of an integer, representing the sum of m and n, and a sequence of m+n 0s and 1s,
representing an initial sequence. A 0 denotes a white disk and a 1 denotes a black disk. The sum of m and n is at least 10 and does not exceed 30. There is a space between numbers.

Output

The output should print either ��YES�� or ��NO�� for each test case, one per line.

Sample Input

2

18 0 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 1

14 1 1 0 0 1 1 1 0 0 1 1 0 1 0

Output for the Sample Input

YES

NO



找规律 分析的太棒了http://www.cnblogs.com/scau20110726/archive/2013/06/12/3133078.html,类似的题目 一定要注意分析问题的 实质,抓住问题的核心,就能找到突破口。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
    int T,n,val;
    cin>>T;
    while(T--)
    {
        int tot0=0;
        int tot1=0;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>val;
            if(val&&i&1)
                tot1++;
            else if(val&&i%2==0)
                tot0++;
        }

        if(n&1||(n%2==0&&abs(tot1-tot0)<=1))
        {
            cout<<"YES"<<endl;continue;
        }
        else
            cout<<"NO"<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: