题目描述

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

题目分析

很显然,这个题目是不能用暴力n重循环来求解的,在网上找了好多解答,主要的思想就是dfs回溯。

进行深度优先搜索时,脑海中要形成自己的一个框架:
1.寻找约束条件,即边界,否则程序就停不下来了~~~
2.确定主要的函数体,即在一遍一遍的递归调用中要去做什么事情 (博主水平有限所以没有太去区分 递归与回溯)

开始回溯:
第一层dfs选择(1,1)作为第一个皇后的位置,标记hang[1]=1,然后判断这个皇后的位置是否符合要求,如果符合要求,则进行第二层dfs;若不符合要求,则更换第一个皇后的位置为(1,2)标记hang[1]=2,再重复上述过程。而进入第二层循环的dfs则把第二个皇后放到(2,1)位置,如上继续进行判断…………等到进行到第八层dfs且这八个皇后都能合法放好后,则记录这一次的合法放置。然后从第八个皇后位置开始进行回溯,取消第八个皇后的标记,回到第七个皇后的放置考虑上来,7的位置加1,然后再次开始判断后面的是否满足。

这个确实比较绕,要想彻底搞懂dfs的回溯需要不断地想 想 想 还有做题 做题 做题!
从第一个皇后开始画多叉树来模拟递归层次便于理解,不过需要准备一张非常大的纸~~

AC代码

#include<iostream>
#include<cmath>
#include<stdio.h>
#include<stdlib.h>
#include<cstdio>
#include<time.h>
#include<cmath>
#include<algorithm>
using namespace std;int map[15][15]={0};//棋盘,值为0表示没有棋子,为1表示有棋子
int hang[15]={0};//hang的值则表示第i行的那一列放棋子
bool check(int num,int i)
{ //判断 1-(num-1)行 是否与 将放在第num行第i个的棋子冲突 for(int j=1;j<num;++j){  // 列不重复,不在一条对角线上(即判断斜率,且注意判断斜率时不要写除法,会出现变量为0的情况且不报错!!)if(hang[j]==i || abs(hang[j]-i)==abs(j-num))  return false;}return true;//返回ture,代表(num,i)可以放棋子
}
int sum,n;
void print()
{ //输出每一行皇后的位置for(int i=1;i<=n-1;i++)cout<<hang[i]<<" ";cout<<hang[n];cout<<endl;
}
void dfs(int num)
{ //深度优先遍历寻找可以放棋子(皇后)的地方 if(num>n) //如果遍历层数大于棋盘的边长,则停止递归,进行记录/输出{ sum++;    //记录满足条件的皇后放置种类加1if(sum<=3)print();  //这是单独针对 p1219题的~~~return ;}for(int i=1;i<=n;i++){hang[num] = i;   //第num行皇后的放置位置为i,即皇后放置在(num,i)坐标上if(check(num,i)) //第 num行,第 i 列 {map[num][i]=1; //记录皇后位置dfs(num+1); //进行下一层递归map[num][i]=0;  //注意回溯,否则容易错误记录(因为满足条件的种类可能很多,读脏数据!}}
}
int main()
{cin>>n;dfs(1);cout<<sum;
}

洛谷 P1219-八皇后(dfs回溯)相关推荐

  1. 洛谷 P1219 八皇后

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

  2. 洛谷 P1219 ---- 八皇后

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

  3. 洛谷——P1219 八皇后

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

  4. 洛谷 P1219 八皇后题解

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

  5. 洛谷 P1219八皇后

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

  6. 洛谷 | P1219 八皇后(DFS)C++

    输入 6 输出 2 4 6 1 3 5 3 6 2 5 1 4 4 1 5 2 6 3 4 AC的C++代码如下: 程序分析 (1)flag[1][ ]和flag[2][ ]储存对角线上的棋子分布情况 ...

  7. Java 洛谷 P1219 八皇后

    题目链接:https://www.luogu.com.cn/problem/P1219 代码实例: import java.util.Scanner; /** * @author: 梁树鹏*/ pub ...

  8. 深度优先搜索——八皇后问题(洛谷 P1219)

    题目选自洛谷P1219     该题针对6-13皇后都行,只需改动输入的数字. 八皇后问题是经典的DFS问题,唯一需要注意的就是判断能够放置的条件,即满足什么状况是对的. 题目要求不能在同一行,同一列 ...

  9. 洛谷P1219 [USACO1.5]八皇后 Checker Challenge(C语言)

    洛谷P1219 [USACO1.5]八皇后 Checker Challenge 题目 代码 这个八皇后问题也是经典入门深搜的题目了呀,理论上深搜都可以运用数据结构的栈来模拟计算机内部的压栈操作.但这里 ...

  10. P1219 八皇后(N皇后,烧脑标记剪枝,DFS)

    P1219 八皇后 Luogu 应用 题库 训练 比赛 记录 讨论 20.7K 通过 45.7K 提交 题目提供者 评测方式 云端评测 标签 USACO高性能 难度 普及/提高- 时空限制 1000m ...

最新文章

  1. stream filter_Stream 流实践
  2. JTable表头也就是标题行给隐藏
  3. 深入浅出 PouchContainer 容器化业务实践 Workshop 开放报名
  4. Redis 中常用命令
  5. html5 deckview,六本木Hills出現超大型巨人?進擊的巨人展FINAL×頂樓Sky Deck的VR體驗...
  6. 清华博士的逆袭路:从延毕警告到在顶刊发文,我蛰伏了四年
  7. 使用SQL Server作业设置定时任务
  8. 易混淆知识点(3):b和strong的真正区别在哪?
  9. 【redis】三种redis数据导出导入方式
  10. python 放射 水平_基于Python的放射性核素大气扩散程序初步开发与验证
  11. 100%在CSS中是什么意思?
  12. java中hashmap_Java HashMap – Java中的HashMap
  13. 磁盘管理,quota,RAID,LVM
  14. C# System.Drawing.SystemColors 系统颜色
  15. Unity3D研究院之解决ttf繁体字体不显示问题
  16. 实验二——病毒行为监控--搭建反病毒实验室
  17. Martin Fowler微服务论文--译文
  18. 【What if 系列】拖住那架飞机!
  19. pyppeteer 模拟登录淘宝H5,获取cookie
  20. 异步赠书:12月《Go Web编程》领航

热门文章

  1. 《那些年 在美国》读书笔记-1
  2. 微信小程序/网站 上传图片到腾讯云COS
  3. iso烧录工具之rufus
  4. 加拿大国家银行开展区块链试点,简化“复杂”谈判流程
  5. HTML期末大作业~玄幻情缘游戏官网静态html模板
  6. AG-Admin 学习之路
  7. 使用Socks5代理保障Windows网络安全
  8. 简介公开密钥算法和证书生成
  9. qq邮件引流需要注意什么?QQ邮件群发推广的技巧
  10. 《UnityAPI.Component组件》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+GetComponent+SendMessage+Tag+立钻哥哥++OK++)