在初次接触到该题时,有点不知所措看了题解之后,发现是博弈论的题,算是对博弈论的初步接触。
题目如下:
## 题目背景
(原创)
有一天 pb和zs玩游戏 你需要帮zs求出每局的胜败情况
## 题目描述
游戏规则是这样的: 每次一个人可以对给出的数进行分割,将其割成两个非零自然数,之后由另一个人选择留下两个数中的其中一个;之后由另一个人进行分割这个剩下的数,重复步骤……
当一个人无法对数进行分割的时候游戏结束,另一个人获胜
现在要你求出N次游戏的胜败
每局由pb先进行分割,如果pb赢输出"pb wins" 如果zs赢输出"zs wins"
注:双方都是绝顶聪明的
## 输入格式
第一行一个数N,表示数据组数
之后N行,每行一个数M,表示每局初始的数
## 输出格式
共N行,每行一串字符 表示游戏结果
## 样例 #1
### 样例输入 #1
```
5
1
3
7
20
5
```
### 样例输出 #1
```
zs wins
zs wins
zs wins
pb wins
zs wins
```
## 提示
1<N<50
1<=m<=1000000000
浅浅说一下个人理解:
博弈论思想存在三种状态,一种是必胜态、必输态、还有反败为胜的状态
由于下棋的人都是顶顶高手,所以不存在反败为胜的状态,也就是说局面一开始就是注定的
那么我们就需要判断这个输赢的条件
胜利条件是:当一个人无法对数进行分割的时候游戏结束
也就是说当分下的数全为1,最后剩的数是2
手上有奇数的人是必输的,因为无论如何分割都是奇数与偶数的组合
这个时候只需要后手选择偶数,将偶数拆成1+m,m是奇数的形式,先手方就一定会输
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int m;
for (int i=1;i<=n;i++)
{
cin>>m;
if (m%2!=0)
cout<<"zs wins"<<endl;
else
cout<<"pb wins"<<endl;
}
return 0;
}