n皇后问题
Subject: n− 皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数 n,请你输出所有的满足条件的棋子摆法。 输出格式: 每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。 其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。 每个方案输出完成后,输出一个空行。 注意:行末不能有多余空格。 输出方案的顺序任意,只要不重复且没有遗漏即可。
Steps: 1.创建路径数组path[i][j]; 2.遍历每行,对第i行中的每个元素进行判断(path[i][j]='Q'是否可行); 3.创建3个判断数组:col[],dg[],udg[]分别判断一行中第j个元素在列,对角线,反对角线上是否可行; dg[j + i] 表示 i行j列处,所在的对角线上有没有棋子,udg[n - j + i]表示 i行j列处,所在的反对角线上有没有棋子,col[j]表示第j列上有没有棋子。当!col[j] && !dg[j + i] && !udg[n - j + i]为真,则代表 r行i列处可以放棋子。 4.递归path[i][j]; 5.递归完成后回溯。
#include<iostream> using namespace std; char path[99][99];//路径 int col[99], dg[99], udg[99];//判断数组 int n; void dfg(int u)//第u行 { int i, j; if (u >= n)//如果遍历到最后一行,则输出 { for (i = 0; i < n; i++) { cout << path[i]<<endl; } cout << endl; return; } for (j = 0; j < n; j++)//遍历第u行的每一个元素 { if (!col[j] && !dg[j + u] && !udg[n - j + u]) { path[u][j] = 'Q'; col[j] = dg[j+u] = udg[n-j+u] = 1; dfg(u + 1); //回溯 path[u][j] = '.'; col[j] = dg[j + u] = udg[n - j + u] = 0; } } } int main() { while (cin >> n && n > 0) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) path[i][j] = '.'; dfg(0); } return 0; }