#1172 : 博弈游戏·Nim游戏·二
题目链接:http://hihocoder.com/problemset/problem/1172?sid=963116
时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB
-
8 HHTHTTHT
样例输出
-
Bob
-
关于赢家如何维持必赢局面?
无论对方取走多少石子,赢家只要取走同数量的石子即可,即”抵消“!因为两者的异或结果为0。若是在刚开局时,对方并还没有行动过,那么赢家可以取走一堆比较特殊的石子,只要使得其他的异或结果为0就保持了每次留赢的局面给自己。
#include <bits/stdc++.h> using namespace std; int a; int main() { int n; string s; while(cin>>n) { cin>>s; a=0; for(int i=0; i<n; i++) //拆成单个正面情况 { if(s[i]=='H') { if(i==0) a=i+1; else a=a^(i+1); } } if(a)//不为0 cout<<"Alice"<<endl; else cout<<"Bob"<<endl; } return 0; }
描述
Alice和Bob这一次准备玩一个关于硬币的游戏:
N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N。现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿,在一枚硬币翻转后决定要不要将该硬币左边的任意一枚硬币也翻一次(正面翻到背面或背面翻到正面)。翻最后一枚正面向上的硬币的人获胜。同样的,这次游戏里面Alice仍然先手,两人均采取最优的策略,对于给定的初始局面,Alice会获胜还是Bob会获胜?
输入
第1行:1个正整数N,表示硬币数量。1≤N≤10,000
第2行:1个字符串,第i个字符表示编号为i的硬币状态,’H’表示正面朝上,’T’表示背面朝上。
输出
第1行:1个字符串,若Alice能够获胜输出"Alice",否则输出"Bob"