标签:没有 pac closed detail main win spl 粘贴 --
首先给出题意:
题意:给出一个矩阵,每个点都有一些石子,有两个人移石子,只能向右移或向下移,直到谁不能移谁输。
分析:在和最后一个点奇偶性相同的点移偶数次就能到,所以可以不考虑,剩下的就是一个简单的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 }
标签:没有 pac closed detail main win spl 粘贴 --
原文地址:https://www.cnblogs.com/pandaking/p/9906767.html