经典算法之《八皇后》

  八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:

在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

  其实这个算法挺简单,但是久仰八皇后的大名一直没下手,其实就是一个dfs+回溯,记得给点染色和清除染色就ok,一共92种摆法,

自我感觉自己的代码还是挺简单的,而且觉得算法比百度百科里面还是要好那么一些,于是就果断贴上来了;temp[]数组用来存放每一种摆

法的状态,为8位的整数,每一位代表每一行所放置的列的位置。

  下面来分析一下算法吧:我们对每一个合适的点进行dfs,由于每一行只能放一个棋子,所以一旦有了合适的位置放置棋子就往下一行

摆放,同时把这个点标记为已经放棋子,这样在下面的dfs中就可以来判断存放下一颗棋子是否符合标准,如果符合则继续下一行,最后当row==8

时,回溯,同时消除上一个放置点的标记。这样的遍历便不重复。ps:在判断的时候可以适当优化,不过这个算法也已经很快

 1 //====================================================================
 2 //Name       :经典问题--八皇后
 3 //Author     :hxf
 4 //copyright  :http://www.cnblogs.com/Free-rein/
 5 //Description:
 6 //Data       :2012.8.19
 7 //========================================================================
 8 #include<iostream>
 9 #include<algorithm>
10 #include<stdio.h>
11 #include<math.h>
12 #include<string>
13 #include<cstring>
14 #include<vector>
15 #include<stack>
16 #include<queue>
17 #define MAXN 100050
18 #define inf 10100
19 using namespace std;
20 int map[10][10];
21 int ans=0;
22 int temp[100];//存放结果状态
23 void dfs(int row)
24 {
25     for(int j=1;j<=8;j++)
26     {
27         int s=0;//在下面的判断里若不符合要求则标记为1
28         for(int i=1;i<row;i++)
29         {
30             if(map[i][j]==1)
31                 s=1;
32             for(int k=1;k<=8;k++)
33                 if(((row-i==j-k)||(row-i==k-j))&&map[i][k]==1)
34                 {
35                     s=1;
36                     break;
37                 }
38         }
39         if(s==0&&row<8)//第row行第j列符合存放要求
40         {
41             map[row][j]=1;//标记颜色
42             dfs(row+1);//dfs下一行
43             map[row][j]=0;//dfs完毕,消除染色
44         }
45         if(s==0&&row==8)
46         {
47             int state=0;
48             for(int i=1;i<8;i++)
49             {
50                 for(int k=1;k<=8;k++)
51                 {
52                     if(map[i][k]==1)
53                         state=state+k;
54                 }
55                 state=state*10;
56             }
57             state=state+j;
58             ans++;//计数器+1
59             temp[ans]=state;
60             break;
61         }
62     }
63 }
64 int main()
65 {
66     memset(map,0,sizeof(map));
67     for(int j=1;j<=8;j++)
68     {
69         map[1][j]=1;
70         dfs(2);
71         map[1][j]=0;
72     }
73     printf("%d\n",ans);
74     while(1)
75     {
76         int n;
77         scanf("%d",&n);//输入n
78         printf("%d\n",temp[n]);//输出第n种状态
79     }
80     return 0;
81 }

  是不是代码完了就没事了呢?处在学习阶段果断不能这样(→_→) ...我们想想还有木有别的方法,建图的话那就差不多了,当然我们也可以不用染色,而用hash,在这里

一共也不过8^8种状态量,于是构建一个hash表来存放每一种状态,如果这种状态已经处理过了则可以直接跳过,应该也是可以得到答案的...

 

转载于:https://www.cnblogs.com/Free-rein/archive/2012/08/19/2646692.html

手把手教你用gmid方法设计二级运放:从理论到仿真全流程(附避坑指南) 本文详细介绍了使用gmid方法设计二级运放的全流程,从理论到仿真实践,特别针对初学者常见问题提供避坑指南。通过系统化的晶体管尺寸确定技术,帮助工程师在性能、功耗和面积之间找到最佳平衡点,适用于模拟集成电路设计中的关键模块开发。 阅读详情

相关推荐

SAP BTP-Cloud foundry 构建并部署JAVA应用程序

本文为 SAP BTP Java 应用程序的简单实例, 我们可以用此实例来熟悉SAP BTP 中的java应用开开发流程.在你完成改示例java应用程序以后, 我们可以直接使用该java应用程序进行后续的开发流程, 或直接构建一个新的JAVA应用程序来支持新的业务开发。

seyafly的博客 803

CSP-SJ 信息学一本通 1214:八皇后

CSP-S/J信息学资料 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 5610 通过数: 3423 【题目描述】 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=...

lck19930315的专栏 331

World Action Model:经典论文

郑困时,图prorpt为机量人压务时,退过驱制解弱词表(constrsinsd decoding), 强附模型只从.256个者动作token中保H, B象总注活地。始VLA之一,RT-2使用了大量的五联网VQ据与少里的机械网的AcSonDat行CoFine-Tunng, 独组sl, 共i744个episode,Mous使用三个专累模,分是vidogonmedel,actonesget,understandng。包的核定之的的观到沟血黄动作,预之后现(vorlemodel),tseing,2。

u013250861的博客 406

人工智能报告:经典回溯问题——八皇后问题

写在报告前: 八皇后是经典的回溯问题,也是人工智能的入门级题目,在保证功能的前提下我尽量缩减了代码量,也在原有报告代码添加注释以方便大家快速掌握。 一.作业任务 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 二...

weixin_44001813的博客 3158

STM32G0实战:HAL库与LL库Flash操作避坑指南(附HardFault解决方案)

本文深入剖析了STM32G0系列微控制器在Flash操作中常见的HardFault问题,对比了HAL库与LL库在读写擦除操作上的底层差异与潜在陷阱。文章提供了基于寄存器状态分析的精准调试方法,并给出了经过实战检验的解决方案与健壮的代码框架,帮助开发者有效规避数据丢失与系统崩溃风险。

t8u9v0w1x的博客 730

Wincc7.5SP1 按钮操作记录(二次确认及语音播报)

Wincc 7.5 SP1 按钮操作记录生成(含二次确认及语音播报) 前面一篇文章已经介绍了“语音播报WINCC报警”,本文是之前功能的延伸,记录按钮操作记录并实现播报。 操作记录及语音播报效果 <创建消息文本> 1. 创建消息文本 消息编号100,消息等级“系统无确认”,消息类型“操作员输入消息”,消息文本“循环水泵启动操作”,其他参数默认。 消息编号101,消息等级“系

徐站的春天 1万+

八皇后算法带给我们的启示吧

八皇后算法 美其名曰算法,其实就是穷举。。。 以一维数组存储结果, 例a[i]=3,其中的i就是第几个皇后,第几个皇后就处于第几行。 以4皇后为例进行穷举。。。因为三皇后无解。(从八皇后问题我们可以得到一个深刻的知识,就是要想老婆多,房子就得大,且多!!!) 总结收获: 1、递归就是穷举的简化代码表达 2、递归的结束就是所有可能的遍历结束(所以递归的结束判断是不存在的)!! ...

qq_25231249的博客 419

使用C# HslCommunication库实现三菱PLC通信(含完整代码示例)

在工业自动化开发中,上位机与PLC的通信是关键环节。HslCommunication库是一个开源的.NET工业通信库,支持三菱、西门子、欧姆龙等多个品牌PLC的通信协议。本文将演示如何通过库实现C#程序与三菱PLC的通信,并提供完整的代码示例。

StevenChen的博客 2290

用wenyan-lang实现经典算法:八皇后、斐波那契等案例详解

wenyan-lang是一款独特的文言文编程语言,它让开发者能够用古汉语语法编写计算机程序。本文将通过八皇后问题、斐波那契数列等经典算法案例,展示如何使用wenyan-lang实现复杂逻辑,感受传统文化与现代编程的完美融合。 ## 初探wenyan-lang编程环境 wenyan-lang提供了直观的在线IDE,让开发者可以轻松编写、编译和运行文言文代码。界面左侧为文言文代码编辑区,右侧实时显

gitblog_00384的博客 838

SAP公司间STO业务解析(包含主数据解析、后台配置解析、前台业务演示)

SAP公司间STO业务解析

ww114784的博客 1018

【即插即用模块】Transformer篇 | CVPR 2025 | SADA:多尺度+可变形采样,完美替换自注意力实现涨点!

文章摘要 本文提出了一种尺度自适应可变形注意力模块(SADA),用于处理图像修复中的结构化伪影问题。SADA通过多尺度多头机制捕获远程依赖关系,并引入可变形采样偏移来有效处理非均匀空间分布的模式。该模块适用于底层视觉任务,可替代ViT自注意力,实验证明能显著提升性能。代码已开源,支持即插即用集成。 核心特点: 多尺度头适应不同大小的重复模式 可变形偏移优化非均匀分布采样 轻量级设计,易于集成到现有架构 适用场景:图像去噪、超分辨率等底层视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1431

经典算法问题——八皇后

大学的时候就特别喜欢研究算法,记得大学的时候经常会拿些数学问题来做算法。八皇后便是其中之一。当时学的C,C的goto语句真的是相当好用。最近讲课又讲起八皇后问题了,忍不住把自己的算法又贴出来,算是给自己留个回忆吧。 #include "stdio.h" #define N 8 void main() {     int i,j,m,n,p,q,x,y;     int a[N];

zsq0511的专栏 610

Unreal 从入门到进阶 之 如何实现Pixel Streaming

Unreal Engine 5 (UE5) 的 Pixel Streaming 是一项基于云端的实时流媒体技术,允许将 UE5 应用的高质量图形渲染结果通过 WebRTC 协议传输到用户的浏览器或轻量级设备,同时将用户输入(如鼠标、键盘、触控)回传到服务器处理。UE的插件相对比较好用,但是就是环境下载总是失败。希望这篇文章对你有所帮助。

TxNet 1369

毕业设计 基于Unity3D的迷宫类游戏设计 回溯算法以及八皇后等经典算法

游戏的娱乐性在于游戏的迷宫探索,3D游戏不同于2D,游戏的过程中,不能采用上帝视角观看游戏的迷宫,需要人工挨个探索,增加了游戏的难度。迷宫类的游戏,是一款关于回溯算法以及八皇后等经典算法的一个算法类游戏,也加入了3D游戏的概念和建模概念,游戏中的人物都是通过建模生成的角色,迷宫也是建模后的迷宫,是一款经典的3D游戏引擎开发。点击空格按钮,可以重置迷宫布局。游戏建模设计:游戏的建模设计,是游戏的核心,首先要对游戏中的人物,游戏迷宫中的相应的树木,景色等进行建模,创建一个丰富的游戏迷宫,并进行游戏。

QQ_188083800的博客 888

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++经典算法题-八皇后

8. Algorithm Gossip: 八皇后 说明 西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八 个皇后如何相安无事的放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧。 解法 关于棋盘的问题,都可以用递回求解,然而如何减少递回的次数?在八个皇后的问题中, 不必要所有的格子都检查过,例如若某列检查过...

逍遥云恋 1045

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

经典算法问题-01-八皇后

八皇后问题问题描述:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 简化问题:由于八皇后问题的正确答案为92种排列方案,由于正确的棋子放置方式实在太多,难以一一列举,所以先简化问题,解决四皇后的排列,即将8×8棋局改为4×4棋局,规则不变建立模型:要使用C++解决这个

CycloneKid的博客 6110

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

八皇后时间复杂度_经典算法之八皇后问题

点击上方“算法与数据之美”,选择“置顶公众号”更多精彩等你来!八皇后问题是一个古老而又著名的问题,是学习回溯算法的一个经典案例。今天我们就一起来探究一下吧!时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题,在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。后面陆续有不同的学者提出自己的见解。...

weixin_39778582的博客 1461

数据结构经典算法学习之八皇后01

八皇后 故事背景: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。而且仅当 n = 1 或 n ≥ 4 时问题有解。 八皇后问题最早是由国际西洋棋棋

皮皮王的专栏 1054

经典算法---八皇后C语言

经典算法—八皇后 递归回溯求解 规则:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。 话不多说,上代码! #include <stdio.h> #include <stdlib.h> int sum=0; void show(int *a,int b); int check(i

m0_53255045的博客 240

[经典算法] 八皇后

题目说明: 西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上,1970年与1971年,E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧。 题目解析: 关于棋盘的问题,都可以用递回求解,然而如何减少递回的次数?在八个皇后的问题中,不必要所有的格子都检查过,例如若某列检查过,该该列的其它格子就不用再检查了,这个方...

weixin_34023863的博客 75

经典算法10:回溯法求解八皇后

八皇后问题:在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 思路:简单的说就是 从当前列中依次选取位置,与前面列中选取的位置进行比较,判断是否冲突,若冲突,回溯到上一列寻找,否则进入下一列寻找位置    1、从column=0列中选取一个位置,column+1,转到2。(这里column为当前列 值为0~7),

momocsdn 8994

经典算法代码实现 (汉诺塔、八皇后等等)

文章目录线性表递归汉诺塔八皇后 线性表 递归 汉诺塔 #include <stdio.h> //将N个盘子从x借助y移动到z void move(int n, char x, char y, char z) { if(n==1) { printf("%c-->%c\n",x,z); } else { move(n-1,x,z,y); /...

JShawn的博客 785

经典算法问题:八皇后的Python解法

想了想,没啥说的,代码不算难,涉及到的知识点本文都有说明: #八皇后问题 board=[ [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0...

flying meng的菜鸟居 1076

数据结构经典算法(8)八皇后

说明:西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八  个皇后如何相安无事的放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问 题来讲解程式设计之技巧。  解法关于棋盘的问题, 都可以用递回求解, 然而如何减少递回的次数?在八个皇后的问题,中  不必要所有的格子都检查过,例如若某列检查过,该该列的其它格子就不用再检查了,

水墨丹心,无情雨 2081
上一篇: URAL-1830(Help in the RNOS)解题报告
下一篇: LCA 最近公共祖先
badao7116
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值