题目描述
有一个n×n 的国际象棋棋盘(n 行 n 列的方格图),请在棋盘中摆放 n 个受伤的国际象棋皇后,要求:
- 任何两个皇后不在同一行。
- 任何两个皇后不在同一列。
- 如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。
输入描述
输入的第一行包含一个整数 n。
其中,1≤n≤10。
输出描述
输出一个整数,表示答案。
输入输出示例:
输入:4
输出:2
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
一个基础dfs,代码含注释( ̄︶ ̄)↗
AC代码:
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cmath>
#include <map>
#include <vector>
#include <queue>
#include <set>
using namespace std;
typedef long long ll;
typedef vector<int> VI;
typedef pair<int, int> PII;
int n;
int a[11];//第i行存储在第a[i]列
int ans = 0;
bool valid(int x,int y)//判断(x,y)是否可以放置皇后
{
for (int i = 1; i < x; i++) {
if (a[i] == y) return false;//判断同列
if (x - i == y - a[i] && abs(x - i) <= 3) return false;//判断左上到右下对角线
if (a[i] + i == x + y && abs(x - i) <= 3) return false;//判断左下到右上对角线
}
return true;
}
void dfs(int row) {//row表示行
if (row == n + 1) { ans++; return; }//n行已经搜索完毕,方案数加一,跳出搜索
for (int i = 1; i <= n; i++) {//遍历该行每一列
if (valid(row, i)) {
a[row] = i;
dfs(row + 1);
a[row] = 0;
}
}
}
int main()
{
cin >> n;
dfs(1);//从第一行开始搜
cout << ans;
return 0;
}