New Stone Game

分析
考虑到每个玩家第一次移除石头时,必须将所选石堆的石子完全移除
那么前两手必定是在对角线
上

且最终决定胜负前一手状态一定是如图 1.2 所示
那么问题就是考虑一个 NIM 游戏, 对除前两轮选取的数之外的数进行 XOR
如果不在所选两个数的对角线,xor 本身,其余 xor 本身 - 1
NIM_SUM 为 1 , 先手必胜,否则先手必败
那么可以枚举 Alice 的位置,然后再枚举不和 Alice 同行或同列 Bob 的位置
再进行求 NIM_SUM,判断即可
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| int a[3][3]; void solve(){ int cot = 0; for(int i = 0;i < 3;i++) for(int j = 0;j < 3;j++) cin >> a[i][j]; int res = 0; for(int i = 0;i < 3;i++) for(int j = 0;j < 3;j++){ int f = 0; for(int ii = 0;ii < 3;ii++){ for(int jj = 0;jj < 3;jj++){ int sum = 0; if(ii == i || jj == j) continue; for(int l = 0;l < 3;l++){ for(int r = 0;r < 3;r++){ if(l == i && r == j) continue; if(l == ii && r == jj) continue; if(l == i || l == ii || r == j || r== jj) { sum ^= (a[l][r] - 1); } else sum ^= a[l][r]; } } if(!sum) f = 1; } } if(!f) res++; } cout << res << endl; }
|