在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。例如:
现在我们把棋盘扩展到 n×n 的棋盘上摆放 n 个皇后,请问该怎么摆?
请编写程序,输入正整数 n,输出全部摆法(棋盘格子空白处显示句点“.”,皇后处显示字母“Q”,每两个字符之间空一格)。
输入格式
正整数 n(n>0)
输出格式
若问题有解,则输出全部摆法(每两种摆法之间空一行)。
若问题无解,则输出 None。
要求:试探的顺序按从上到下逐行进行,其中每一行按从左到右的逐格进行,请参看输出样例2。
输入样例1
3
输出样例1
None
输入样例2
6
输出样例2
. Q . . . . . . . Q . . . . . . . Q Q . . . . . . . Q . . . . . . . Q . . . Q . . . . . . . . Q . Q . . . . . . . . Q . Q . . . . . . . . Q . . . . . Q . . Q . . . . . . . . . Q . . Q . . . . . . . . . Q . . Q . . . . . . . Q . . . Q . . . Q . . . . . . . . . . Q . . . Q . . . Q . . . .
思路: 用dfs搜索出全部方案,然后剪去不符合题意的,最后注意一下格式就行了
#include <bits/stdc++.h> using namespace std; const int N = 110; int n, t; char g[N][N]; bool col[N], dg[N], udg[N]; // 列, 主对角线, 次对角线 void dfs(int u) { if(u == n) { if(t) cout << endl; for (int i = 0; i < n; i ++ ) { for (int j = 0; j < n; j ++ ) { if(j) cout << ' '; cout << g[i][j]; } cout << endl; } t ++; return ; } for (int i = 0; i < n; i ++ ) { if(!col[i] && !dg[u + i] && !udg[i - u + n]) // 剪枝 { g[u][i] = 'Q'; col[i] = dg[u + i] = udg[i - u + n] = true; dfs(u + 1); g[u][i] = '.'; col[i] = dg[u + i] = udg[i - u + n] = false; } } } int main() { cin >> n; for (int i = 0; i < n; i ++ ) for (int j = 0; j < n; j ++ ) g[i][j] = '.'; dfs(0); if(!t) cout << "None"; return 0; }