2020杭电多校第十场1010-hdu6886-Tic-Tac-Toe-Nim
nim游戏,可以一步步讨论:
第一轮,Alice先手取一个:
1.Bob后手取了一个同行或同列的,那么Alice在同一行列取剩下的一个即可取胜。
2.Bob后手取了一个不共线的,那么继续讨论。
第二轮,还剩下7个位置,其中一个位置与前两个点不同行也不同列,剩下的六个位置谁取最后一个石头就必败。
因此这六个位置的值-1和那个不共线的位置构成一个普通的nim游戏。
#include <bits/stdc++.h>
using namespace std;
int t,a[6][6];
int main(){
scanf("%d",&t);
while(t--){
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
scanf("%d",&a[i][j]);
}
}
int sum=0;
for(int i=1;i<=3;i++){//枚举第一个点
for(int j=1;j<=3;j++){
int flag=0;
for(int ii=1;ii<=3;ii++){//枚举第二个点
if(flag)break;
for(int jj=1;jj<=3;jj++){
if(ii==i||jj==j)continue;//第二个点和第一个点不共线
int x=0;
for(int iii=1;iii<=3;iii++){//枚举第三个点,如果出现后手获胜的局面,就不加到sum里
for(int jjj=1;jjj<=3;jjj++){
if((iii==i&&jjj==j)||(iii==ii&&jjj==jj))continue;//不与前两个点重合
if(iii==6-i-ii&&jjj==6-j-jj)x^=a[iii][jjj];//第三个点与第一个点和第二个点均不共线
else x^=(a[iii][jjj]-1)//第三个点处于六个位置之中
}
}
if(x!=0){//后手获胜,取消枚举第三个点
flag=1;
break;
}
}
}
if(flag==0)sum++;
}
}
printf("%d\n",sum);
}
}