这里是代码传送门

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

所谓八皇后问题,就是在8X8的棋盘上,求如何让可以往八个方向直走的皇后不互相攻击的摆放方法的解;

很显然,我的第一想法是用深搜剪枝(书上说是 回朔法 )

如何实现呢?我的想法是,先预定让每个皇后占一行,然后暴力搜索皇后所在列的情况,然后递归剪掉不满足的情况;

代码如下


#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<iostream>
#define PI acos(-1)
#define ull unsigned __int64
#define Min(a,b) ((a>b)?b:a)
#define Max(a,b) ((a>b)?a:b)
#define INF 1000000007
using namespace std;
bool v[8]={0};//用来记忆
int node[8];//记录不同行的皇后所在的列
int coun=0;//统计一共解法
void dfs(int t)
{
if(t==8)//如果能达到8行,说明是满足条件的,不然会被剪枝
{
for(int i=0;i<8;i++) printf("(%d,%d) ",i,node[i]);
printf("\n");
coun++;
return ;
}
for(int i=0;i<8;i++)//遍历
{
if(!v[i])//皇后的列数不能相同
{
int flag=true;//判断斜线
for(int j=0;j<t;j++)
{
if(node[j]==i-(t-j)||node[j]==i+(t-j))
//遍历前面已经给出的皇后是否在同一斜线位置,前面一个是k=-1的斜线,后面是k=1的斜线
{
flag=false;//如果在同一斜线,则不能满足条件
break;
}
}
if(flag)//满足条件
{
node[t]=i;
v[i]=1;
dfs(t+1);
v[i]=0;//这一步很重要
} } }
return ;
}
int main()
{
dfs(0);
printf("count=%d\n",coun);
}

最终结果给出了92种情况,与网上无差。

之后参考了《挑战程序设计》p193页,发现思想与第一种方法无差

但是,他给出了另外一种更高效的解法。

定义的bool类型为二维的 bool vis[3][18],可以更加高效的实现算法:

改进版代码如下:

#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<iostream>
#define PI acos(-1)
#define ull unsigned __int64
#define Min(a,b) ((a>b)?b:a)
#define Max(a,b) ((a>b)?a:b)
#define INF 1000000007
using namespace std;
bool vis[3][18]={0};
int node[8];
int coun=0;
void dfs(int t)
{
if(t==8)
{
printf("(%d,%d)",0,node[0]);
for(int i=1;i<8;i++) printf(" (%d,%d)",i,node[i]);
printf("\n");
coun++;
return ;
}
for(int i=0;i<8;i++)
{
if(!vis[0][i]&&!vis[1][i+t]&&!vis[2][t-i+8])
//V[0][i]表示记忆,vis[1][i]表示左下右上的斜线,vis[2][i]表现左上右下
{
vis[0][i]=vis[1][i+t]=vis[2][t-i+8]=1;
node[t]=i;
dfs(t+1);
vis[0][i]=vis[1][i+t]=vis[2][t-i+8]=0; } }
return ;
}
int main()
{
dfs(0);
printf("count=%d\n",coun);
}

只用了一层循环,这告诉了我们一点:

学好数学是很重要的

八皇后问题解题报告(dfs的更多相关文章

  1. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  2. POJ1014 解题报告(DFS)

    题目在此:http://poj.org/problem?id=1014 要看清题意呢,题中要求输入的是价值分别为1,2,3,4,5,6的大理石的个数,而不是6块价值为输入数字的大理石!选这个题主要想练 ...

  3. 洛谷 P2123 皇后游戏 解题报告

    P2123 皇后游戏 题意: 给定\(T\)组长为\(n\)的\(A\),\(B\)数组和\(C\)的计算方法,求一种排列方法,使最大的\(C\)最小化. 数据范围: \(1 \le T \le 10 ...

  4. 洛谷 1219:八皇后 (位运算 & DFS)

    题目链接: https://www.luogu.org/problem/show?pid=1219#sub row:受上面的皇后通过列控制的位置 ld:受上面的皇后通过从右至左的斜对角线控制的位置 r ...

  5. Leetcode547 朋友圈解题报告 (DFS

    题目描述: 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋 ...

  6. [luogu P2123] 皇后游戏 解题报告(贪心)

    题目链接:https://www.luogu.org/problemnew/show/P2123 题目大意: 给定a数组和b数组,要求最小化c数组中的最大值 题解: 考虑微扰法,推一波式子先 设$x= ...

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

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

  8. 八皇后(dfs+回溯)

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

  9. 【第40套模拟题】【noip2011_mayan】解题报告【map】【数论】【dfs】

    目录:1.潜伏者 [map] 2.Hankson的趣味题[数论]3.mayan游戏[dfs] 题目: 1. 潜伏者(spy.pas/c/cpp)[问题描述]R 国和S 国正陷入战火之中,双方都互派间谍 ...

随机推荐

  1. Oracle之rman常用命令及维护(51CTO风哥rman课程)

    list 查看数据库备份的信息 查询数据库对应物 list incarnation; list backup summary; 列出当前备份信息及汇总 B是备份 F是全备 A是归档 第三个A是是否有效 ...

  2. jenkins-cli, plugin/extracolumns

    ++++++++++++++++++++++++++++++++++++++++++++++++ echo "构建地址:${BUILD_URL}" >> xxx.log ...

  3. linux UIO

    UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍(由www.169it.com搜集整理) UIO(Userspace I/O)是运行在用户空间的I/O技术.Linu ...

  4. 转载(web app变革之rem)

    rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...

  5. Python并行编程(五):线程同步之信号量

    1.基本概念 信号量是由操作系统管理的一种抽象数据类型,用于在多线程中同步对共享资源的使用.本质上说,信号量是一个内部数据,用于标明当前的共享资源可以有多少并发读取. 同样在threading中,信号 ...

  6. linux rhel unix centos FreeBSD 常用命令

    一:使用CentOS常用命令查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /pr ...

  7. pytorch调参经验(一)

    个人博客:https://yifdu.github.io/2018/11/18/pytorch%E8%B0%83%E5%8F%82%E7%BB%8F%E9%AA%8C%EF%BC%88%E4%B8%8 ...

  8. 【spring-boot】spring-boot整合ehcache实现缓存机制

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心 ...

  9. lamp环境的搭建和安装

    最近,部门有些系统需要迁移到新的机器上,因此需要在新的机器上安装lamp和lnmp的环境,因此在这里总结一下: 一. 安装lamp环境的步骤:  (1).因为是新的机器,因此需要安装gcc的各种环境: ...

  10. labview 的连接

    https://www.youtube.com/watch?v=AsQ56CmnfEA&list=PLp02wZHiCj4tcot7tPumcOeVR51oqzf6V