lightoj1393------博弈

首先给出题意:

                     题意:给出一个矩阵,每个点都有一些石子,有两个人移石子,只能向右移或向下移,直到谁不能移谁输。

                     分析:在和最后一个点奇偶性相同的点移偶数次就能到,所以可以不考虑,剩下的就是一个简单的NIM博弈。

给出一个写的不错的人的博客:https://blog.csdn.net/y1196645376/article/details/52255695

这道题首先暴露了我对常用模型转换的不足,而且没有博弈的思想,我个人认为博弈的思想是前者一直想安排后者,后者一直想安排前者,这样会大致陷入一个平衡状态,我觉得巴什博奕是最好体现这种思想的一种模型

然后接下来是粘贴那个楼上链接那个大佬的思路,不想写了:

分析:

如果该方格中的一个点的坐标与n+m的奇偶性相同,则不需要考虑该点。因为若该点与n+m奇偶性相同,设该点坐标为(i,j)(0<=i<=n,0<=j<=m)则(n+m)-(i+j),即到达终点的步数为偶数,也就是说先手怎么移动后手就怎么移动,先手右后手就下,先手下后手就右,也就是说等于没移动。所以我们只需要考虑与n+m不同的,也就是n+m和i+j一个奇数一个偶数,也就是说,这些点距离终点只需要也只能移动一次,每次可以从一个方格中取任意个石子移动,这就转化为了尼姆博弈中的取石子问题,因为尼姆博弈中可以随意取石子。异或为0为必败态一定会转化为必胜态,异或为1为必胜态可以转化为必败态,具体详见下最基础的尼姆博弈--取石子问题,就ok了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int t,r,c,a,ans;
 7 int main(){
 8     scanf("%d",&t);
 9     for(int kase=1;kase<=t;kase++){
10         scanf("%d%d",&r,&c);
11         ans=0;
12         for(int i=1;i<=r;i++){
13             for(int j=1;j<=c;j++){
14                 scanf("%d",&a);
15                 if((r+c-i-j)%2==0) continue;
16                 ans^=a;
17             }
18         }
19         printf("Case %d: ",kase);
20         if(ans) printf("win\n");
21         else printf("lose\n");
22     }
23     return 0;
24 }
View Code

猜你喜欢

转载自www.cnblogs.com/pandaking/p/9906767.html