算法基础之n-皇后问题

n-皇后问题

  • dfs: 将下一个皇后不能放的位置标记

    • col列 dg对角线 udg反对角线

    • 已经确定一列只有有一个皇后的做法:

      •   #include<iostream>
          using namespace std;
          const int N=20;
          
          char g[N][N];
          int n;
          bool col[N],dg[N],udg[N];
          
          void dfs(int u){
                 
              
              if(u==n){
                 
                  for(int i=0;i<n;i++) puts(g[i]);  //输出棋盘
                  puts(" ");
                  return;
              }
              
              for(int i=0;i<n;i++){
                 
                  //udg中n是因为下标不能为0 需要加上n的偏移量 相当于映射一下
                  if(!col[i]&&!dg[u+i]&&!udg[n-u+i]){
                   //u看作y i看作x 一次函数的关系
                      g[u][i] = 'Q' ;
                      col[i] = dg[u+i] = udg[n-u+i] =true;
                      dfs(u+1);
                      col[i] = dg[u+i] = udg[n-u+i] =false;
                      g[u][i] = '.';
                  }
              }
          }
          int main(){
                 
              cin>>n;
              
              for(int i=0;i<n;i++){
                 
                  for(int j=0;j<n;j++){
                 
                      g[i][j] = '.';
                  }
              }
              
              dfs(0);
              
              return 0;
          }
        
    • 更加原始的思路的做法:

      •   #include<iostream>
          using namespace std;
          const int N=20;
          
          char g[N][N];
          int n;
          bool row[N],col[N],dg[N],udg[N];
           
          void dfs(int x,int y,int s){
                   //x为横轴,y为纵轴,n为皇后个数
              if(y==n) y=0,x++;  //纵轴爆了 
              if(x==n){
                   //横轴爆了 遍历完
                  if(s==n){
                   //皇后数量符合要求 输出
                      for(int i=0;i<n;i++) puts(g[i]);
                      puts("");
                      return;
                  }
                  return;
              }
              //不放皇后
              dfs(x,y+1,s);
              
              //放皇后
              if(!row[x] && !col[y] && !dg[x+y]&& !udg[n+x-y]){
                 
                  g[x][y] = 'Q';
                  row[x] =col[y] =dg[x+y]=udg[n+x-y] = true;
                  dfs(x,y+1,s+1);
                  row[x] =col[y] =dg[x+y]=udg[n+x-y] = false;
                  g[x][y] = '.';
              }
              
          }
          int main(){
                 
              cin>>n;
              
              for(int i=0;i<n;i++){
                 
                  for(int j=0;j<n;j++){
                 
                      g[i][j] = '.';
                  }
              }
              
              dfs(0,0,0);
              
              return 0;
          }
        

相关推荐

  1. 算法基础n-皇后问题

    2023-12-08 03:48:03       45 阅读
  2. c语言算法深度优先搜索(n皇后问题

    2023-12-08 03:48:03       14 阅读
  3. 算法设计与分析 | N皇后问题

    2023-12-08 03:48:03       35 阅读
  4. LeetCode-题目整理【12】:N皇后问题--回溯算法

    2023-12-08 03:48:03       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 03:48:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 03:48:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 03:48:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 03:48:03       18 阅读

热门阅读

  1. 如何使用PDCA循环来提升软件产品的质量

    2023-12-08 03:48:03       34 阅读
  2. 股票怎么加杠杆买入

    2023-12-08 03:48:03       32 阅读
  3. Web3之L2 ZK-Rollup 方案-StarkNet

    2023-12-08 03:48:03       39 阅读
  4. 存储过程与视图

    2023-12-08 03:48:03       37 阅读
  5. 【UGUI】实现UGUI背包系统的六个主要交互功能

    2023-12-08 03:48:03       39 阅读
  6. deepin v20 在线安装docker

    2023-12-08 03:48:03       39 阅读