【数据结构】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.递归完成后回溯。

 

#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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值