一、题意解析

  国际象棋中的皇后,可以横向、纵向、斜向移动。如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线、竖线、斜线方向上?八皇后问题是一个古老的问题,于1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?以高斯为代表的许多数学家先后研究过这个问题。后来,当计算机问世,通过计算机程序的运算可以轻松解出这个问题。

二、如何解决八皇后问题?

  所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......

  如果某一层看遍了所有格子,都无法成功摆放,则回溯到上一个皇后,让上一个皇后右移一格,再进行递归。如果八个皇后都摆放完毕且符合规则,那么就得到了其中一种正确的解法。说起来有些抽象,我们来看一看递归回溯的详细过程。

  1.第一层递归,尝试在第一行摆放第一个皇后

  2.第二层递归,尝试在第二行摆放第二个皇后(前两格被第一个皇后封锁,只能落在第三格):

  3.第三层递归,尝试在第三行摆放第三个皇后(前四格被第一第二个皇后封锁,只能落在第五格):

  4.第四层递归,尝试在第四行摆放第四个皇后(第一格被第二个皇后封锁,只能落在第二格):

  5.第五层递归,尝试在第五行摆放第五个皇后(前三格被前面的皇后封锁,只能落在第四格):

  6.由于所有格子都“绿了”,第六行已经没办法摆放皇后,于是进行回溯,重新摆放第五个皇后第八格。:

  7.第六行仍然没有办法摆放皇后,第五行也已经尝试遍了,于是回溯到第四行,重新摆放第四个皇后第七格。:

  8.继续摆放第五个皇后,以此类推......

代码:打印所有的摆放方法以及方法总数

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<sstream>
#include<iostream>
using namespace std; int num=; void output(bool arr[][])
{
num++;
printf("\n");
for(int i=;i<;i++)
{
for(int j=;j<;j++)
printf("%d ",arr[i][j]);
printf("\n");
}
} bool check(bool arr[][],int row,int column)///检查落子是否合法,参数分别是行,列
{
if(row==) ///第一行落子肯定合法
return true; ///一行只摆一个就换行,所以不用判断行是否合法 int i,j;///判断同一列上有没有棋子
for(i=;i<row;i++)
{
if(arr[i][column])
return false;
}
i=row-;
j=column-;///判断左上斜线是否有棋子
while(i>=&&j>=)
{
if( arr[i][j] )
{
return false;
}
i--;
j--;
}
i=row-;
j=column+;///判断右上斜线是否有棋子
while(i>=&&j<)
{
if( arr[i][j] )
{
return false;
}
i--;
j++;
}
return true;
} void slove(bool arr[][],int row)///回溯法,核心代码
{///从第一行第一列开始摆放,如果合法就继续摆,深度搜索所有答案
for(int column=;column<;column++)
{
arr[row][column]=true;///摆下去先,再判断是否落子合法
if( check(arr,row,column) )
{
if( row+== ) ///摆到第八行,并且落子合法,则棋盘正确摆放了
output(arr);
else
slove(arr,row+);///如果该落子合法,又没有到第八行,则继续下一行开摆
}
arr[row][column]=false;///不摆这一颗子,摆下一颗子进行深度搜索
}
}
int main()
{
bool chess[][];
memset(chess,false,sizeof(chess));
slove(chess,);
printf("num=%d\n",num);
return ;
}

八皇后问题-dfs的更多相关文章

  1. 八皇后(dfs+回溯)

    重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...

  2. 八皇后问题 dfs/递归

    #include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; ...

  3. 洛谷P1219 :八皇后(DFS+回溯)

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  4. 洛谷P1219 八皇后【dfs】

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  5. 洛谷 P1219 八皇后【经典DFS,温习搜索】

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

  6. 八皇后问题解题报告(dfs

    这里是代码传送门 所谓八皇后问题,一开始接触,上学期舍友提及的,但是因为各种原因,水平不够,并没有关心,偶然之间,再次遇见,便进行的尝试(棋盘是0-7的,不是1-8的...开始打弄错了) 所谓八皇后问 ...

  7. 用dfs求解八皇后问题

    相信大家都已经很熟悉八皇后问题了,就是指:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法.主要思路:按行进行深度优先搜索,在该 ...

  8. 八皇后问题(DFS)

    题目描述: 要在国际象棋棋盘中放八个皇后,使任意两个皇后都不能互相吃,皇后能吃同一行.同一列,同一对角线上(两个方向的对角线)的任意棋子.现在给一个整数n(n<=92),输出前n种的摆法. 输入 ...

  9. kb-01-a<简单搜索--dfs八皇后问题变种>

    题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的 ...

随机推荐

  1. REST framwork之认证,权限与频率

    认证组件 局部视图认证 在app01.service.auth.py: class Authentication(BaseAuthentication): def authenticate(self, ...

  2. hive中sql使用英文分号

    hql只要遇见分号则认识是语句的EOF,所以对于分号,需要用“\“转义. 例如: insert overwrite table test_json_map select '{"account ...

  3. spring boot 整合pagehelper分页插件

    Spring Boot 整合pagehelper分页插件 测试环境: spring boot  版本 2.0.0.M7 mybatis starter 版本  1.3.1 jdk 1.8 ------ ...

  4. c# 后台AJAX

    public class BackA { #region 后台 AJAX public static string GetPage(string posturl) { Stream outstream ...

  5. [python] pyCharm 右击出现run unittest 解决办法

    最近在使用 pyCharm 的时候发现一个情况,右击时出现 "unittests for ...",这时候如果继续点击 run ,可能会出现错误. 看到网上的介绍说,原因是程序方法 ...

  6. 运行vbs脚本

    VBS是基于Visual Basic的脚本语言. VBS的全称是:Microsoft Visual Basic Script Edition.(微软公司可视化BASIC脚本版). 其语言类似Visua ...

  7. android 开发 实现一个ListView套嵌GirdView的滚动布局

    效果图 实现思维: 首先要处理管理好需要导入的数据,我们这里创建class来处理这些数据并且便于管理它们. 创建一个主activity的布局,里面需要一个ListView控件. 创建一个class继承 ...

  8. FasDfs缩略图解决方案 -- Linux

    前面研究了fastdfs的安装部署,并且做了多机同步. 这次我们解决下FastDFS做文件服务器并处理缩略图的问题. 有两个方案,方案1,在上传过程中生成多张图片,服务器存备.方案2,只上传一张图片, ...

  9. CPU UsageTimes Profile (cpu=times)

    HPROF工具能搜集CPU使用信息通过注入代码到每个方法进入点和退出点.因此能够统计方法真实调用次数和花费的时间. 它使用BCI(Byte Code Injection),所以比cpu=samples ...

  10. java.net.BindException: 地址已在使用 (Bind failed)

    java.net.BindException: 地址已在使用,是因为端口被占用,出现在启动服务的时候 报错如截图 报错显示 10062端口被占用冲突 执行netstat -alnp | grep 10 ...