第二屆太原理工大學程序設計新生賽決賽 A Reversi

題目傳送門

題目描述
翻轉棋,有時也被稱作黑白棋,是一種由兩個玩家進行的棋類遊戲,一方玩家控制白棋,另一方玩家控制黑棋,當一方玩家放置自己棋子後,如果有連續相鄰的另一方玩家的棋子與當前棋子擺放在一條直線上,且直線上的另一端是自己顏色的棋子,則這些對方玩家的棋子都會變成己方玩家棋子的顏色,這種操作便稱爲翻轉。 某日,Vanis、Qiy和Adolph外出比賽,乘坐了去X地的火車。火車上三個人感到很無聊,因此vanis提議玩翻轉棋。爲了方便遊戲,他們對翻轉棋做了簡化,簡化後的規則如下:

初始有個棋子連續放置,擺在一排,使用0表示白色棋子,1表示黑色棋子,Qiy使用黑色棋子並且先手操作,每個玩家每次只能在當前棋盤上所有棋子的最左邊或最右邊放置一枚棋子,並且需要保證在放置後至少翻轉一個棋子,如果當前狀態不存在滿足此條件的操作,則跳過本次操作回合(除此情況外,不能跳過操作回合),如果某個狀態雙方玩家都無法操作,則遊戲結束,此時自身顏色的棋子數多的一方獲勝。這場遊戲輪到Qiy與Vanis進行,Adolph希望知道如果雙方都採取最優策略,誰能獲得勝利。
舉個例子,若初始棋盤爲0010。

Qiy先手操作將黑子擺在最左側,根據翻轉規則,中間的兩顆白色棋子被翻轉成黑色。

Vanis操作,將白色棋子擺在最左側,中間的四枚黑色棋子變成白色,此時雙方玩家都無法操作,遊戲結束,Vanis獲勝。

輸入描述:
第一行輸入一個正整數n,表示初始棋子數目。

第二場輸入一個長度爲n的字符串,表示初始棋盤擺放,其中1表示黑色棋子,0表示白色棋子。

數據規範:

1≤n≤10^6

輸出描述:
根據遊戲結果輸出"Vanis win"或"Qiy win"。(不含雙引號)
示例1
輸入

4
0010

輸出

Vanis win

示例2
輸入

3
111

輸出

Qiy win

示例3

輸入

3
101

輸出

Qiy win

思路:這題你要真的去想它的原理,真得不知道如何去想,不過你可以多找幾個數據好好觀察一下規律。最後能得到兩邊都是0的時候,先手必敗,其餘情況後手必敗。(題做的多了很快就能看出來規律)

#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
int main()
{
    int n;
    string str;
    cin>>n;
    cin>>str;
    int len=str.size();
    int ret=0;
    if(str[0]=='0'&&str[len-1]=='0')
        cout<<"Vanis win"<<endl;
    else cout<<"Qiy win"<<endl;
    system("pause");
    return 0;


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章