首页 > 其他分享 >N皇后问题

N皇后问题

时间:2024-03-14 21:32:34浏览次数:8  
标签:Map 15 int dfs 问题 对角线 皇后

问题引入:

八皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

0N皇后问题 - 蓝桥云课 (lanqiao.cn)

思路:dfs,按照一行到n行顺序放入,判断皇后在列的位置是否合法(写一个函数判断当前皇后所在位置的行和列还有两条对角线上是否存在其他的皇后,若不存在则合法),若不合法,找下个位置,若合法,dfs下一行,当达到终点时,结果加一。

Check函数检查对角线时的规律:

右上对角线:横竖坐标的和为一定值,例:4+1=5,3+2=5,2+3=5,1+4=5......

1,11,21,31,41,51,61,71,8
2,12,22,32,42,52,62,72,8
3,13,23,33,43,53,63,73,8
4,14,24,34,44,54,64,74,8
5,15,25,35,45,55,65,75,8
6,16,26,36,46,56,66,76,8
7,17,27,37,47,57,67,77,8
8,18,28,38,48,58,68,78,8

右下对角线:横竖坐标的差为一定值,例:2-1=1,3-2=1,4-3=1,5-4=1......

1,11,21,31,41,51,61,71,8
2,12,22,32,42,52,62,72,8
3,13,23,33,43,53,63,73,8
4,14,24,34,44,54,64,74,8
5,15,25,35,45,55,65,75,8
6,16,26,36,46,56,66,76,8
7,17,27,37,47,57,67,77,8
8,18,28,38,48,58,68,78,8

C++代码:

#include <iostream>
using namespace std;

int Map[15];//Map[i]表示第i排存放的皇后
int N;
int res;
bool Check(int m,int n)//检查位置Map[m][n]是否能放皇后
{
  for(int i=1;i<=m;i++)
  {
    if(Map[i]==n)//检查列
    return false;
    if(i+Map[i]==m+n)//检查左对角线
    return false;
    if(i-Map[i]==m-n)//检查右对角线
    return false;
  }
  return true;
}

void dfs(int a)
{
  if(a>N)//a==n+1,a==n时还为选完
  {
    res++;
    return;
  }

  for(int i=1;i<=N;i++)//遍历列
  {
    if(Check(a,i))
      {
        Map[a]=i;
        dfs(a+1);
        Map[a]=0;//复原
      }
  }
}
int main()
{
  // 请在此输入您的代码
  cin>>N;
  dfs(1);
  cout<<res;
  return 0;
}

希望对有需要的人能有所帮助,欢迎大家有什么问题到评论区里一起讨论!

标签:Map,15,int,dfs,问题,对角线,皇后
From: https://blog.csdn.net/2301_81374681/article/details/136666294

相关文章

  • 使用EasyExcel读取Excel文件遇到的小问题
    没有读取到内容的问题excel内容具体代码importcom.alibaba.excel.EasyExcel;importcom.alibaba.excel.annotation.ExcelProperty;importjava.io.File;importjava.util.List;publicclassTestEasyExcel{publicstaticvoidmain(String[]args){Lis......
  • QT 自定义QGraphicsItem 缩放后旋转 图形出现漂移问题
    实现自定义QGraphicsItem缩放和旋转时,遇到了这样一个问题:将item旋转一个角度,然后拖拽放大,再次进行旋转时图像会发生漂移。原本以为是放大后中心点位置没有改变,导致旋转时以原中心的旋转出现了偏移,但是重新设置旋转中心setTransformOriginPoint(rect.center());并没有起作用,图像......
  • 代码随想录算法训练营第四十六天| 139.单词拆分 多重背包 背包问题总结篇!
    单词拆分 题目链接:139.单词拆分-力扣(LeetCode)思路:竟然真能转化为背包问题。classSolution{public:boolwordBreak(strings,vector<string>&wordDict){unordered_set<string>t(wordDict.begin(),wordDict.end());vector<bool>dp(s.size()+......
  • k8s 相关问题汇总
    拉镜像报错某个目录找不到Failedtopullimage"xxx.xxx.cn/cem/cem-python:cemhikvision-1ad4685-20240314140514":rpcerror:code=Unknowndesc=failedtopullandunpackimage"xxx.xxx.cn/cem/cem-python:cemhikvision-1ad4685-20240314140514":failed......
  • 高并发下如何解决数据库性能瓶颈问题
    在高并发场景下,数据库往往是性能瓶颈的一个重要因素。以下是一些常用的方法来解决数据库性能瓶颈问题:数据库优化:对数据库进行性能调优,包括索引优化、查询优化、表结构设计优化等。使用合适的索引可以加速查询操作,同时注意避免过多索引导致性能下降。优化查询语句,避免不必要的......
  • 为什么weak_ptr可以解决循环引用问题
    weak_ptr可以解决循环引用问题的主要原因在于它不会增加对象的引用计数,从而不会导致对象无法被销毁。在循环引用中,两个或多个对象相互持有对方的shared_ptr,导致对象的引用计数始终不为零,即使程序不再使用这些对象,它们也无法被销毁,从而造成内存泄漏。weak_ptr的引入可以打破这......
  • 解决VS Code无法使用F5调试pyhton代码的问题
    不知什么原因,从2024年2月(估计时间)开始,发现VSCode无法使用F5对部分python脚本进行调试,同一个目录下的pyhton脚本有些可以用python正常调试,有些不行,特征是按下F5时,这些脚本的修改可以被保存,但是不会被执行,原因不明。目前通过查找网络资料发现了一种可行的办法,如下所示:首先,在编辑......
  • [Dubbo] Dubbo 反序列化将Pair转化成HashMap的问题
    问题描述Dubbo在3.2.x版本中,类检查级别默认是STRICT3.1版本中默认为WARN告警级别,3.2版本中默认为STRICT严格检查级别。不配置的情况下,会将名单以外的类型转化成Map。如何支持Pair的序列化和反序列化dubbo.application.serialize-check-status=WARN新建允许的名......
  • 若依框架学习 跨域问题
    本地项目前后端会出现跨域问题,若依的前端会通过反向代理解决。若依前端通过拼接字符串在devServer里配置proxy属性,但是需要配置webpack。通过vue.config.js修改devServer:{proxy:{'/api':{target:'http://localhost:8000',//将请求代理到的目......
  • Kubernetes集群节点处于Not Ready问题排查
    Kubernetes集群节点处于NotReady问题排查原创 点击关注......