2020杭电多校第十场1010-hdu6886-Tic-Tac-Toe-Nim

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);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值