1. 程式人生 > 實用技巧 >有趣的nim game

有趣的nim game

hdoj1730.Northcott Game
當棋子緊貼著時先手必輸,n行緊貼的棋子先手必輸,原題相當於取完n行兩棋子中間的部分構成n行緊貼的局面,等價於nim game

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
const int mod=1e9+7;
int n,m,k;
signed main(){
    int T,x,y;
    while (scanf("%d%d",&n,&m)==2){
        int ans=0;
        for (int i=1;i<=n;i++){
            scanf("%d%d",&x,&y);
            ans^=abs(x-y)-1;
        }
        if (ans==0)puts("BAD LUCK!");
        else puts("I WIN!");
    }
    return 0;
}

hdoj6886.Tic-Tac-Toe-Nim
取完2個格子後,必存在a 0 b類似的行列,要使其構成1 0 1的必輸局面,也就是(a-1)^(b-1)類似的nim game
例 0 2 3 為(2-1)(3-1)(4-1)(6-1)(7-1)(8-1)9
4 0 6
7 8 9

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[4][4];
int main(){
    int T;
    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 tot=0;
        for (int i=1;i<=3;i++){
            for (int j=1;j<=3;j++){
                int ans=1;
                for (int k=1;k<=3;k++){
                    for (int p=1;p<=3;p++){
                        if (k==i||p==j)continue;
                        int r=0;
                        for (int x=1;x<=3;x++){
                            for (int y=1;y<=3;y++){
                                if (x==i&&y==j)continue;
                                if (x==k&&y==p)continue;
                                if (x==k||x==i||y==p||y==j)r^=a[x][y]-1;
                                else r^=a[x][y];
                            }
                        }
                        if (r==0)ans=0;
                    }
                }
                if (ans==1)tot++;
            }
        }
        cout<<tot<<endl;
    }
    return 0;
}

hdoj5795.A Simple Nim