当前位置: 首页 > article >正文

深搜专题8:N皇后

描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解。请写一个程序找出所有跳棋放置的解,并把它们以上面的序列方法输出。解按字典顺序排列,请输出前3个解,最后一行是解的总个数。 输入描述 一个数字N (6<=N<=14) 表示棋盘是N x N大小的。 输出描述 前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

用例输入:

4

用例输出:

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

难点就是在如何判断对角线。

#include <bits/stdc++.h>
using namespace std;
int vis_z[30],vis_f[30],vis[30],ans[30],sum,n;
void dfs(int x,int i){
    if(x==n+1){//深度达标
        sum++;
        if(sum<=3){//只需输出前三个解
            for(int i=1;i<=n;i++){
            	cout<<ans[i]<<" ";
        	}
            cout<<endl;
        }
        return;
    }
    for(int j=1;j<=n;j++){
        if(!vis_z[i-j+n]&&!vis_f[i+j]&&!vis[j]){//判断主对角线,副对角线及列
            vis_z[i-j+n]=1;
            vis_f[i+j]=1;
            vis[j]=1;
            ans[i]=j;//标记
            dfs(x+1,i+1);
            vis_z[i-j+n]=0;
            vis_f[i+j]=0;
            vis[j]=0;
            ans[i]=0;//回溯
        }
    }
}
int main(){
    cin>>n;
    dfs(1,1);
    cout<<sum;//在dfs外输出总的解个数
    return 0;
}


http://www.kler.cn/a/585506.html

相关文章:

  • 最节省服务器,手搓电子证书查询系统
  • Navicat安装流程
  • 鸿蒙 @ohos.arkui.dragController (DragController)
  • 深度学习中学习率调整策略
  • NetLink内核套接字案例分析
  • 程序化广告行业(13/89):DSP的深入解析与运营要点
  • CH340 模块的作用及其与 JTAG、串口下载和 TTL 电平的关系
  • 【春招笔试】2025.03.13-蚂蚁春招笔试题
  • VisionPro中IPO工具详解
  • 代码随想录二刷|图论7
  • 【品铂科技工业生产应用案例解析】
  • 海马下载 1.0.2 | 纯净无广告,极简设计,不限速下载工具
  • Spring TX配置(声明式事务管理+annotation)
  • C++中,存储持续性、作用域和链接性
  • 鸿蒙应用开发-轻松获取http网络请求
  • MariaDB 10.6.21(安装后实际版本为10.6.19)
  • 67.Harmonyos NEXT 图片预览组件之性能优化策略
  • Redis项目_黑马点评
  • transformer bert 多头自注意力
  • Linux ECM子网掩码常见问题排查