N皇后
N皇后
Problem Description
八皇后问题是算法领域的经典问题,在国际象棋棋盘上总共是8*8的格子,在每一行中都要放置一个皇后,任意两个皇后之间不能相互攻击,皇后的攻击范围是直线和斜线,也就是任意两个皇后都不能处于同一个横行、纵行或斜线上。
现在我们将问题扩展为N皇后问题,也就是在N*N的棋盘上放置N个皇后,必须满足任意两个皇后不能相互攻击,写一个程序计算在给定N之后,有多少种不同的摆放方法(不考虑对称等问题)。
Input
给定一个正整数N表示皇后的个数。
Output
不同摆放方法的个数。
题解
#include<cstdio>
#include<cmath>
int N;
int count = 0;
int location[20];
int valid(int row, int col) {
for (int i = 1;i <= row - 1;i++) {
if (col == location[i] || abs(row - i) == abs(col - location[i])) {
return 0;
}
}
return 1;
}
void dfs(int row) {
if (row == N + 1) {
count++;
return;
}
for (int i = 1;i <= N;i++) {
if (valid(row, i)) {
location[row] = i;
dfs(row + 1);
}
}
}
int main() {
scanf("%d", &N);
dfs(1);
printf("%d\n", count);
return 0;
}
浙公网安备 33010602011771号