题目描述:
在 n*n 格(n<=8)的国际象棋棋盘上摆放 n 个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
输入
一行一个正整数,表示 n。
输出
输出一个正整数,表示n皇后摆放的个数。
输入样例
8
输出样例
92
解题思路
下图中的绿色格子一个皇后的封锁范围
Code
#include <bits/stdc++.h>
using namespace std;
int n, ans = 0;
bool mp[15][15];
bool Check(int i, int j) {
for(int v = 1; v <= n; v++) {
if(mp[v][j])
return false; //检测之前放置的列
}
for(int v = 1; v < i && v < j; v++) {
if(mp[i - v][j - v])
return false; //检测左上到右下的斜线
}
for(int v = 1; v < i && j + v <= n; v++) {
if(mp[i - v][j + v])
return false;
}
return true;
}
void Queen(int i) {
if (i == n + 1) {
ans++;
return;
}
for (int j = 1; j <= n; j++) {
if (Check(i, j)) {
mp[i][j] = true;
Queen(i + 1);
mp[i][j] = false;
}
}
}
int main() {
cin >> n;
Queen(1);
cout << ans << endl;
return 0;
}