杭电多校2020 第十场 J - Tic-Tac-Toe-Nim HDU - 6886

题目大意:

3 × 3 3 \times 3 3×3的格子,每个格子有 a i j a_{ij} aij个火柴棒, A l i c e Alice Alice B o b Bob Bob轮流取火柴,当某人取完之后,出现同一行(列)是空的,那么该人获胜,同时 A l i c e Alice Alice先取,且第一轮每人都必须取空一个格子
问:当 A l i c e Alice Alice先取哪些格子时,她能必胜,这样的格子总数有多少?

解题思路:

刚看到时,一脸懵逼,随便枚举了下情况,发现,好家伙,我根本不懂…
题解做法:
在这里插入图片描述
哎呀,为啥是这样子呢,我也不知呀,我也很懵逼…直到我在洛谷上看到了这样一篇题解:题解 P1247 【取火柴游戏】
然后你就能明白了

AC代码:

#include <bits/stdc++.h>
using namespace std;
int T;
int a[5][5];
int read() {
	int X = 0, p = 1; char c = getchar();
	for (; c > '9' || c < '0'; c = getchar()) if (c == '-') p = -1;
	for (; c <= '9' && c >= '0'; c = getchar()) X = X * 10 + c - '0';
	return X * p;
}
int main() {
	T = read();
	while (T--) {
		int ans = 0, tx = 0;
		for (int i = 1; i <= 3; i++)
			for (int j = 1; j <= 3; j++)
				a[i][j] = read();
		for (int i = 1; i <= 3; i++)
			for (int j = 1; j <= 3; j++)
				tx ^= a[i][j] - 1;//提前预处理
		for (int x1 = 1; x1 <= 3; x1++)
			for (int y1 = 1; y1 <= 3; y1++) {
				bool vis = true;
				for (int x2 = 1; x2 <= 3 && vis; x2++)
					for (int y2 = 1; y2 <= 3 && vis; y2++) {
						if (x1 == x2 || y1 == y2) continue;
						int tmp = tx;
						tmp = tmp ^ (a[x1][y1] - 1) ^ (a[x2][y2] - 1) ^ (a[6 - x1 - x2][6 - y1 - y2] - 1) ^ (a[6 - x1 - x2][6 - y1 - y2]);
						if (tmp == 0) vis = false;
					}
				if (vis) ans++;
			}
		cout << ans << endl;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值