【搜索】八皇后「建议收藏」

【搜索】八皇后「建议收藏」这道题应该不陌生吧,这是一道很经典的搜索题。总的意思就是说在一个n*n的棋盘上放n个皇后,要求它们互不攻击,求解有多少种情况,并输出前三种。那么开始分析:这毕竟是一道搜索题,搜索最大的弊端是什么,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  这道题应该不陌生吧,这是一道很经典的搜索题。

【搜索】八皇后「建议收藏」

【搜索】八皇后「建议收藏」

  总的意思就是说在一个n*n的棋盘上放n个皇后,要求它们互不攻击,求解有多少种情况,并输出前三种。

  那么开始分析:这毕竟是一道搜索题,搜索最大的弊端是什么,当然是时间复杂度极高,虽然这道题可能不会那么卡,我们完全可以开一个二维数组,然后不停标记不能放的位置。但是你是否想过,一维数组+极少的时间复杂度就可以解决问题。

  那么具体说一下该怎么放棋子,我们不需要全局的考虑,因为深搜最大的好处是可以简化繁琐的过程,因此我们先考虑只摆一枚棋子,首先假设已经摆好了,那么要进行怎样的操作。

  【搜索】八皇后「建议收藏」

  如图,比方说现在在第二行第二列的位置上放了一个皇后,那么有哪些点永远不能放棋子呢?

  【搜索】八皇后「建议收藏」

如图,所有红色的格子(包括这个皇后所在的格子)都不能放置皇后了,乍一看,也看不出来什么规律,别着急,把整个图都以二维数组下标的形式标上序号就一目了然了。

  【搜索】八皇后「建议收藏」

  按照国际象棋的规则,皇后所能控制的是它所在的行,列,左上到右下的对角线,右上到左下的对角线。那么我们分开看:

  1)行:如果你够细心,就会发现一行的左边的下标的值都相等,那么我们是不是就可以定义一个一维数组hang(用拼音更好区分),用来存储每行是否被哪一个皇后所霸占,初始赋成0,如果被霸占后,就赋为1,比如说我们要判断(2,4)是否可以放棋子,调用这个数组hang[2]即可知道这一行已经被霸占,所以不能放置。

  2)列:同上,我们仍然可以定义一个数组用来存储是否被霸占,只需注意所有数是纵坐标相同,和行稍有不同。

  3)左上到右下的对角线:这当然是一大难点,我们可以通过坐标发现规律,(1,1),(2,2),(3,3),(4,4)都是图上皇后左上到右下所能控制的点,有没有发现这一列的点的横纵坐标差值相同,简单说就是1-1=2-2=3-3=4-4,(不一定非等于零,随着这个皇后位置的改变,差值是会改变的),所以和上文一样,我们定义一个数组duijiaoxian2,如果要判断(i,j)是否能摆放皇后,只需判断duijiaoxian2[i-j]是否等于1即可。

  4)右上到左下的对角线:同上,只不过是横纵坐标的和相同需要注意就可以了。

  上文是摆棋时的判断,在摆完每一颗棋后要记得把四个数组相应数值改为1即可。

  这样,代码就出来了:

 1 #include<iostream>
 2 using namespace std;
 3 int hang[1000],lie[1000],duijiaoxian1[1000],duijiaoxian2[1000],n,lujin[1000],ans,cnt;
 4 void dfs(int x)
 5 {
 6     if(x>n)
 7     {
 8         ans++;
 9         if(ans<=3)
10         {
11             for(int i=1;i<=n;i++)
12             cout<<lujin[i]<<" ";
13             cout<<endl;
14         }
15         return;
16     }
17     for(int i=1;i<=n;i++)
18     {
19         if(lie[i]==0&&duijiaoxian1[i+x]==0&&duijiaoxian2[i-x]==0)
20         {
21             lie[i]=1;duijiaoxian1[i+x]=1;duijiaoxian2[i-x]=1;
22             cnt++;lujin[cnt]=i;
23             dfs(x+1);
24             cnt--;
25             lie[i]=0;duijiaoxian1[i+x]=0;duijiaoxian2[i-x]=0;//要记得回溯
26         }
27     }
28 }
29 int main()
30 {
31     cin>>n;
32     dfs(1);
33     cout<<ans;
34     return 0;
35 }

  小编的数组起名都是按拼音起的,便于理解,就不在过多解释了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167852.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月4日 下午5:00
下一篇 2022年8月4日 下午5:16


相关推荐

  • java程序一定会加载的包是哪个?

    java程序一定会加载的包是哪个?

    2021年7月16日
    65
  • Redis集群部署的三种方式

    Redis集群部署的三种方式Redis 集群的部署方式 1 主从复制 2 Sentinel 哨兵机制 3 cluster 集群 第一种集群方式 部署简单 分为一主一从 或一主 N 从 数据分布是在所有节点通过 replication 复制全量的数据 如果主节点挂掉 需要手动把其中的一个从节点设置为主节点 第二种集群方式 稍微比第一种复杂点 引入哨兵 此集群的原理还是主从复制 但是此集群中必须至少 3 个 sentinel 节点 来对一主两从的节点进行监控 因为 sentinel 里面存在一个 Leader 选举机制 必须是单数 此时 sentinel 哨

    2025年11月18日
    5
  • java 流媒体服务器搭建_搭建流媒体服务器(1)

    java 流媒体服务器搭建_搭建流媒体服务器(1)一、前语本文纂写时间是2018年12月17日,所描述的软件WowzaMediaServer此时已经出了4或更高,但是2.2.2提供的功能已经是Goodenoughforme.如果发现4足够更好,后面文章也许会再续。本文试图描述一个在WindowsServer2012上安装了WowzaMediaServerv2.2.2流媒体服务的事件。最终会另服务器提供给外部适当的Server和…

    2022年5月16日
    40
  • linux vim查看下一页,Linux下vi和vim模式相互切换「建议收藏」

    linux vim查看下一页,Linux下vi和vim模式相互切换「建议收藏」vi和vim常用的三种模式:1,正常模式在这种模式下,可以使用【上下左右】按键来移动光标,也可使用【删除字符】【删除整行】来处理档案内容,也可使用【复制、粘贴】来处理文件数据。2,插入模式/编辑模式按下i,I,o,O,a,A,r,R等任一一个字母之后就会进入到编辑模式,一般来说按i即可。3,命令行模式在这种模式下,可以提供相关指令,完成读取、存盘、替换、离开vim、显示行号等动作。下图为v…

    2022年6月2日
    63
  • 【AVD】简述某些视频在线播放时卡顿、本地播放时不卡顿的问题

    【AVD】简述某些视频在线播放时卡顿、本地播放时不卡顿的问题曾经在业务中遇到过这样的问题,我们编码出来的视频在Android、iOS端,使用ijkplayer内核的播放器播放时卡顿,甚至无法任意定位播放位置,将导致卡顿无法播放。今天,又有同事遇到类似的问题,而我发现,我只写过一个《用notepad++和Excel协助分析媒体文件包》,而并没有把当时遇到的问题分析记录下来。于是,在此简单说明一下。视频文件结构教科书般的教程、课程中对视频文件结构的描述非常详细,此处不赘述,简单地说,视频文件也是一种文件,是文件,就是一堆二进制数的集合,而且是一个.

    2025年11月25日
    4
  • 推荐书籍:FFmpeg从入门到精通

    推荐书籍:FFmpeg从入门到精通本书是一本介绍FFmpeg的实战技术指南,全书共10章,分为两个部分。第一部分部分(第1~7章)为FFmpeg的命令行使用篇,介绍了FFmpeg的基础组成部分、FFmpeg工具使用、FFmpeg的封装操作、FFmpeg的转码操作、FFmpeg的流媒体操作、FFmpeg的滤镜操作、FFmpeg的设备操作。第二部分(第8~10章)为FFmpeg的API使用篇,介绍了FFmpeg封装部分的API使用操作、FFmpeg编解码部分的API使用操作,FFmpeg滤镜部分的API使用操作,相关操作均以实例方式进行

    2022年6月26日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号