1. 程式人生 > >洛谷 P1288 :取數遊戲II

洛谷 P1288 :取數遊戲II

題目描述

有一個取數的遊戲。初始時,給出一個環,環上的每條邊上都有一個非負整數。這些整數中至少有一個0。然後,將一枚硬幣放在環上的一個節點上。兩個玩家就是以這個放硬幣的節點為起點開始這個遊戲,兩人輪流取數,取數的規則如下:

(1)選擇硬幣左邊或者右邊的一條邊,並且邊上的數非0;

(2)將這條邊上的數減至任意一個非負整數(至少要有所減小);

(3)將硬幣移至邊的另一端。

如果輪到一個玩家走,這時硬幣左右兩邊的邊上的數值都是0,那麼這個玩家就輸了。

如下圖,描述的是Alice和Bob兩人的對弈過程,其中黑色節點表示硬幣所在節點。結果圖(d)中,輪到Bob走時,硬幣兩邊的邊上都是0,所以Alcie獲勝。

(a)Alice (b)Bob (c)Alice (d)Bob

現在,你的任務就是根據給出的環、邊上的數值以及起點(硬幣所在位置),判斷先走方是否有必勝的策略。

輸入輸出格式

輸入格式:

第一行一個整數N(N≤20),表示環上的節點數。

第二行N個數,數值不超過30,依次表示N條邊上的數值。硬幣的起始位置在第一條邊與最後一條邊之間的節點上。

輸出格式:

僅一行。若存在必勝策略,則輸出“YES”,否則輸出“NO”。

輸入輸出樣例

輸入樣例#1: 複製

4
2 5 3 0

輸出樣例#1: 複製

YES

輸入樣例#2: 複製

3
0 0 0

最開始在起點,有兩種走法,一個是順時針,一個是逆時針,在走的過程中是一定要把數取完的,不然對方反向取一下就輸了,關鍵在於能夠遇到的第一個0的位置,只要雙方輪流到最後為0的時候就知道勝負了。

#include<stdio.h>
int a[50];
int main()
{
	int n,i,temp=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i = 1; i <= n; i++)
    {
        if(a[i] == 0)
        {
            if(i % 2 == 0)
            {
                temp=1;
                break;
			}
            else
                break;
        }
    }
    for(i = n; i >= 1; i--)
    {
        if(a[i] == 0)
        {
            if((n - i + 1) % 2 == 0)
            {
                temp=1;
                break;
            }
            else
                break;
        }
    }
    if(temp==0)
    	printf("NO\n");
    else
    	printf("YES\n");
    return 0;
}