P1219 八皇后

题目大意:

给出一个n*n的正方形棋盘,在上棋盘上放下n个皇后,要求每个皇后所在的行,列,两条对角线上没有其他皇后,输出前三种解法(按字典序排,输出结果从上到下用列号表示),并且最后输出解的个数。

输入格式:

一个数字N (6 <= n <= 13) 表示棋盘是n * n大小的。

输出格式:

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

输入样例1:

6

输出样例1:

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

分析:对角线的表示方法(画个图就明白了),通过标记找符合的位置,找到一种解法后清除去除行以外的所有标记记录,行的记录不用清除是为了避免解的重复。

代码:

#include<iostream>
using namespace std;int a[100];//行
int b[100];//列
int c[100];//↙
int d[100];//↖int total;//可行解的个数
int n;void dfs(int i){if(i>n){//在棋盘上成功放下n个皇后if(total<=2){//total从0开始,满2即输出前三个解for(int k=1;k<=n;k++)cout<<a[k]<<" ";cout<<endl;}total++;//记录解的个数return;}else{for(int j=1;j<=n;j++){if((!b[j])&&(!c[i+j])&&(!d[i-j+n])){//d数组中加n是为了避免出现负数a[i]=j;//在i行j列找到一个符合条件的位置放下一个皇后b[j]=1;//标记列被占领c[i+j]=1;d[i-j+n]=1;dfs(i+1);//return之后,回到之前的每一层执行下面三句,清除除行之外所有标记b[j]=0;c[i+j]=0;d[i-j+n]=0;}}}
}
int main(){cin>>n;dfs(1);cout<<total<<endl;return 0;
}

View Code

在洛谷题解中看到有位大佬用了位运算+__builtin函数优化的方法,看评论区说大概是全洛谷最快了,不过我没看懂orz

P1101 单词方阵

题目大意:

给一n×n的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。

输入格式:

第一行输入一个数n。(7≤n≤100)。

第二行开始输入n×n的字母矩阵。

输出格式:

突出显示单词的n×n矩阵。

输入样例1:

8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg

输出样例1:

*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g

分析:

刚接触dfs不久看的题大多是像迷宫这样的,这题一下子没反应过来是一条路做到黑,感觉有点像嵌套的dfs,外面那个负责方向的改变,里面那个在确定方向后一直走,找到完整字符串后要注意回溯标记。个人感觉这道题还不错(大佬请忽略这句话,在本菜鸡眼里可能不存在水题。

代码:

#include<iostream>
#include<string.h>
using namespace std;
int n;
char a[100][100];
char str[]={"yizhong"};
int vis[100][100];
int b[100][100];
int dx[8]={1,-1,0,0,1,1,-1,-1};//x方向
int dy[8]={0,0,1,-1,1,-1,-1,1};//y方向
void dfs(int x,int y,int gx,int gy,int d){if(d==6&&a[x][y]=='g'){vis[x][y]=1;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(vis[i][j]==1)b[i][j]++;//记录可以成功构成”yizhong“的坐标
                }}vis[x][y]=0;return;}int nx=x+gx;int ny=y+gy;//选定方向后寻找下一个字母if(nx>=0&&nx<n&&ny<n&&ny>=0&&a[nx][ny]==str[d+1]){vis[nx][ny]=1;dfs(nx,ny,gx,gy,d+1);vis[nx][ny]=0;}
}int main(){cin>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++){cin>>a[i][j];}memset(vis,0,sizeof(vis));memset(b,0,sizeof(b));for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(a[i][j]=='y'){//遍历搜索'y'for(int k=0;k<8;k++){//八个方向”选定方向后一条路走到黑“vis[i][j]=1;//标记dfs(i,j,dx[k],dy[k],0);vis[i][j]=0;}}}}//输出结果for(int h=0;h<n;h++){for(int k=0;k<n;k++){if(b[h][k]==0)cout<<'*';elsecout<<a[h][k];}cout<<endl;}return 0;
}

View Code

P1605 迷宫

题目大意:

给定一个n*m方格的迷宫,迷宫里有 t 处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。

输入格式:

第一行n、m(1≤n,m≤5)和 t,n为行,m为列,T为障碍总数。第二行起点坐标sx,sy,终点

坐标ex,ey。接下来 t 行,每行为障碍点的坐标。

输出格式:

给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方

案总数。

输入样例1:

2 2 1
1 1 2 2
1 2

输出样例1:

1

分析:

迷宫这一类题目算是dfs和bfs中的经典题目,“加强版”也有很多,这题应该是最简单的版本的吧。

需要注意:每个方格至多经历一次,所以要对路径进行标记,避免重复走,每找出一个方案都要对走过的路径回溯时撤销标记。

代码:

#include<iostream>
#include<string.h>
using namespace std;
int n,m,t,a,b;
int sx,sy,ex,ey;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int ans=0;
int Map[50][50];//标记障碍
int c[50][50];//标记走过的方格
void dfs(int x,int y){if(x==ex&&y==ey){ans++;//记录方案的数目return;}for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(ny>0&&ny<=n&&nx>0&&nx<=m&&Map[nx][ny]==0&&c[nx][ny]==0){c[nx][ny]=1;dfs(nx,ny);c[nx][ny]=0;//回溯清除标记
        }}
}
int main(){cin>>n>>m>>t;cin>>sx>>sy>>ex>>ey;memset(Map,0,sizeof(Map));memset(c,0,sizeof(c));c[sx][sy]=1;for(int i=1;i<=t;i++){cin>>a>>b;Map[a][b]=1;}dfs(sx,sy);cout<<ans<<endl;return 0;
}

View Code

转载于:https://www.cnblogs.com/l-yt/p/10825353.html

【洛谷】普及练习场 深度优先搜索【易】相关推荐

  1. 普及练习场 深度优先搜索 单词接龙

    题意理解 这题目,如果裸写dfs的话,可能会比较烦,所以需要预处理一下.这个预处理还是很关键的,我昨天没有想到预处理,然后心态就很爆炸,什么都没有写出来. 另外,还有很重要的一点是,对于开始位置的处理 ...

  2. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

  3. 洛谷P1074 靶形数独 [搜索]

    题目传送门 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了 ...

  4. 【洛谷】【博弈搜索】P4363 [九省联考2018]一双木棋chess

    洛谷 P4363 [九省联考2018]一双木棋chess 题目大意 ◇题目传送门◆ 分析 根据题目所给定的规则,可以发现对于每一行,其下面一行上放的棋子数目不可能多于上面的一行. 所以我们可以将每行上 ...

  5. (洛谷普及组)2的幂次方

    幂次方 TIitle P1010 [NOIP1998 普及组] 幂次方 题目描述 输入格式 输出格式 样例 样例输入 样例输出 Link Ideals 步骤 思路 Code Analyse TIitl ...

  6. 洛谷题单1-7 搜索题解

    P1219 [USACO1.5]八皇后 Checker Challenge 这个是我最最开始的写法,也是篇幅最大的写法,每放一个棋子就考虑放这个棋子满不满足 每行每列,左斜线和右斜线都只有一个棋子,注 ...

  7. 洛谷P2349 金字塔 A* 搜索

    题目描述 有一盗墓者潜入一金字塔盗宝.当她(难道是Lara Croft ?)打开一个宝箱的时候,突然冒出一阵烟(潘多拉的盒子?),她迅速意识到形势不妙,三十六计走为上计--由于她盗得了金字塔的地图,所 ...

  8. python【洛谷算法题单-搜索】P1605 迷宫

    题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左右四种方式,每次只能移 ...

  9. 深度优先搜索——选数(洛谷 P1036)

    今天的题是一道深度优先搜索的题 题目链接 选自洛谷(P1036) 是一道很经典的DFS问题 首先我们先看一下题目是怎么描述的,读完题目我会在后面给出详细的思路! 题目描述 已知 nn 个整数 x_1, ...

最新文章

  1. Linux下安装、配置PHP环境
  2. vue.js学习笔记(1)
  3. logback-spring.xml 文件路径 相对路径_小白学 Python(18):基础文件操作
  4. Three.js之渲染器
  5. 为右键新建菜单添加内容
  6. YolactEdge:首个开源边缘设备上的实时实例分割(Jetson AGX Xavier: 30 FPS)
  7. ARMA 模型的参数估计 —— 增广最小二乘法
  8. 超频到3200最佳时序_ddr4内存时序多少为好
  9. 【图片服务】深入分析阿里云中图片服务的架构经验
  10. 74HC595 的使用
  11. aop aspectj autoproxy / 的作用
  12. uni-app如何获取位置信息(经纬度)
  13. Windows10远程登陆Ubuntu桌面
  14. 第七课:BootRom的烧录
  15. 【转】为您解决HDMI无声的烦恼
  16. Blackhat 2017Defcon 25学习笔记
  17. Android6.0 高通平台 is 32-bit instead of 64-bit 问题
  18. 代谢组学结果在线分析:不同组差异代谢物高级韦恩图Venn的绘制——UpSet图
  19. Web大学生网页作业成品 基于HTML+CSS+JavaScript-----苹果商城Apple商城 8页 三级带视频
  20. 文华财经期货量化短线策略支撑压力指标公式,短线行情无未来函数多空均线红涨绿跌信号

热门文章

  1. 快速搭建论坛系统看这里,社交系统ThinkSNS助你快人一步!!!
  2. UITabBarController中自定义UITabBar
  3. Tomcat软连接访问配置(symbol link)
  4. UIButton 详解
  5. linux下iscsi
  6. CentOS英文版下安装中文语言包
  7. 成功加入微软GDI计划
  8. [导入]从函数RND的使用想到的!
  9. Java并发编程实战_不愧是领军人物!这种等级的“Java并发编程宝典”谁能撰写?...
  10. faspeed是什么意思_speed是什么意思_speed的翻译_音标_读音_用法_例句_爱词霸在线词典...