【数据结构】DFG——n皇后问题

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.递归完成后回溯。

【数据结构】DFG——n皇后问题_第1张图片

 

#include
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]<> n && n > 0)
     {
          for (int i = 0; i < n; i++)
               for (int j = 0; j < n; j++)
                    path[i][j] = '.';
          dfg(0);
     }
     return 0;
}

你可能感兴趣的:(数据结构,基础算法,c++,算法,数据结构)