ACM-ICPC寒假算法训练1:搜索专题 黑白皇后问题(进一步思考深度遍历)

2*n皇后问题
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>

const int maxn = 10;
int n, ans, mp[maxn][maxn];
int col_black[maxn], diag1_black[2 * maxn], diag2_black[2 * maxn];
int col_white[maxn], diag1_white[2 * maxn], diag2_white[2 * maxn];
void dfs(int k) {
	if (n + 1 == k) {
		ans++;
		return;
	}
	for (int black = 1; black <= n; black++) {
		for (int white = 1; white <= n; white++) {
			if (col_black[black] || col_white[white])	continue;
			if (black == white || !mp[k][black] || !mp[k][white])	continue;
			if (diag1_black[k + black - 1] || diag2_black[k - black + n])	continue;
			if (diag1_white[k + white - 1] || diag2_white[k - white + n])	continue;
			col_black[black] = diag1_black[k + black - 1] = diag2_black[k - black + n] = 1; mp[k][black] = 0;
			col_white[white] = diag1_white[k + white - 1] = diag2_white[k - white + n] = 1; mp[k][white] = 0;
			dfs(k + 1);
			col_black[black] = diag1_black[k + black - 1] = diag2_black[k - black + n] = 0; mp[k][black] = 1;
			col_white[white] = diag1_white[k + white - 1] = diag2_white[k - white + n] = 0; mp[k][white] = 1;
		}
	}
}


int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf("%d", &mp[i][j]);
	dfs(1);
	printf("%d", ans);
	return 0;
}```

上一篇:ACM-ICPC算法寒假训练1:搜索专题A题


下一篇:Lambda表达式