目录

目录

深度优先搜索

基本概念

算法思想

模板

P1706 全排列问题

P1219 [USACO1.5]八皇后 Checker Challenge

P1605 迷宫

P1101 单词方阵



深度优先搜索

基本概念

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

算法思想

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

//模板

void dfs(int step)
{判断边界{相应操作}尝试每一种可能{满足check条件标记继续下一步dfs(step+1)恢复初始状态(回溯的时候要用到)}
} 

P1706 全排列问题

#include<stdio.h>
#include<string.h>
int a[15];
int b[15];
int n;
void dfs(int);
int main()
{scanf("%d",&n);dfs(1);return 0;
}
void dfs(int m)
{int j;if(m==n+1)                    //边界,输出{for(int i=1;i<=n;i++)printf("%5d",a[i]);printf("\n");return ;}for(j=1;j<=n;j++)               //相当于遍历寻找{if(b[j]==0){a[m]=j;b[j]=1;dfs(m+1);b[j]=0;        //回溯}}}

P1219 [USACO1.5]八皇后 Checker Challenge

#include<stdio.h>
int a[40];
int lie[40];
int u[40];
int v[40];
int n;
int cnt;                        //全局变量方便全局输入
void dfs(int);
int main()
{scanf("%d",&n);dfs(1);printf("%d\n",cnt);return 0;
}void dfs(int x)
{int i;if(x==n+1)                  //边界,递归出口{cnt++;if(cnt<=3)                //输出前三行{for(i=1;i<=n;i++)printf("%d ",a[i]);printf("\n");}}for(i=1;i<=n;i++)                //遍历,从第一列到第n列,记住,x为行数{if(!lie[i] && !u[x-i+n] && !v[x+i])    //标记过的就不管,这三个式子用来衡量坐标关系{lie[i]=1;u[x-i+n]=1;v[x+i]=1;                        //标记a[x]=i;                          //a数组用来记住x行的i列,方便输出dfs(x+1);                        //接下来这个递归就是更进一步lie[i]=0;                        //重新标记为0,回溯u[x-i+n]=0;v[x+i]=0;}}
}

P1605 迷宫

#include<stdio.h>
int n,m,t,kx,ky,fx,fy,cnt;
int vis[10][10];                  //原地图的起点和出口标记
int mp[10][10];                  //障碍物的地图标记
int xx[]={1,0,-1,0};
int yy[]={0,1,0,-1};            //横纵坐标的方向改变
void dfs(int,int);
int main()
{int tempx,tempy;scanf("%d %d %d",&n,&m,&t);scanf("%d %d %d %d",&kx,&ky,&fx,&fy);while(t--)                    //标记障碍物{scanf("%d %d",&tempx,&tempy);mp[tempx][tempy]=1;}vis[kx][ky]=1;                //起点dfs(kx,ky);printf("%d\n",cnt);return 0;
}void dfs(int x,int y)
{int i,dx,dy;if(x==fx && y==fy){cnt++;return ;}for(i=0;i<4;i++){dx=xx[i]+x;dy=yy[i]+y;if(dx>=1 && dx<=n && dy>=1 && dy<=m && !vis[dx][dy] &&!mp[dx][dy])    //判断{vis[dx][dy]=1;dfs(dx,dy);vis[dx][dy]=0;}}}

P1101 单词方阵

题目描述

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

输入:8                     输出:qyizhong              *yizhonggydthkjy              gy******nwidghji              n*i*****orbzsfgz              o**z****hhgrhwth              h***h***zzzzzozo              z****o**iwdfrgng              i*****n*yyyygggg              y******g

输入输出样例

输入 #1复制

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

输出 #1复制

*******
*******
*******
*******
*******
*******
*******

输入 #2复制

8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg

输出 #2复制

*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g
#include<stdio.h>
#include<string.h>
#define maxn 110
int mp[maxn][maxn];
char vis[maxn][maxn];
int n;
int xx[]={1,1,1,0,0,-1,-1,-1};
int yy[]={-1,0,1,1,-1,0,1,-1};        //八个方向
char str[]="yizhong";void dfs(int,int);
int main()
{int i,j;scanf("%d",&n);getchar();for(i=0;i<n;i++)scanf("%s",vis[i]);            //输入for(i=0;i<n;i++){for(j=0;j<n;j++){if(vis[i][j]=='y')           //‘y’为起点,搜索开始地方dfs(i,j);                //搜索}}for(i=0;i<n;i++){for(j=0;j<n;j++)                    //输出{if(mp[i][j]==0)printf("*");elseprintf("%c",vis[i][j]);}printf("\n");}return 0;
}void dfs(int x,int y)
{int i,j;for(i=0;i<8;i++){int flag=1;for(j=0;j<7;j++)                //最难点:一个方向的判断{int dx=x+j*xx[i];int dy=y+j*yy[i];if(!(dx>=0 && dx<n && dy>=0 && dy<n) || vis[dx][dy]!=str[j]){flag=0;break;}}if(flag){for(j=0;j<7;j++){int dx=x+j*xx[i];int dy=y+j*yy[i];mp[dx][dy]=1;}}}}

深度优先搜索及例题《基础》 洛谷相关推荐

  1. 深度优先搜索——单词接龙(洛谷 P1019)

    题目选自洛谷P1019 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两次. (其实 ...

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

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

  3. DFS(深度优先搜索)---迷宫(洛谷)----SCAU_LEO

    一.题目 题目链接:迷宫 首先,今天是1月2日,虽然有点晚了,但是还是祝大家新的一年快快乐乐,开开心心,题题AC,场场拿金,! 说说我对迷宫类题目的感受,我记得刚开始学迷宫的时候,不是看的很懂,但是睡 ...

  4. 广度优先搜索——奇怪的电梯(洛谷 P1135)

    广度优先搜索普及/提高篇,今天讲述的是洛谷里的一道题 奇怪的电梯(洛谷 P1135) 说一下我解题时候的思路吧. 首先读清楚题目,题目要求输出从 a楼 到 b楼的最少次数,楼层必须在[1,n]之间升降 ...

  5. 【搜索】NOIP2000 or 洛谷1019单词接龙

    题目链接:洛谷1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在 ...

  6. 广度优先搜索——Corn Maze S(洛谷 P1825)

    题目选自洛谷P1825 题目比较长,但是不难理解.因为求的是一个最短距离,所以用BFS即可. 广搜的主要思想便是将所有可行解(可到达的点)放入队列,然后再一个个遍历所有可行解(可到达的点),知道找到终 ...

  7. 广度优先搜索——字串变换(洛谷 P1032)

    题目选自洛谷P1032 题意已经把做法写得特别露骨了...最小步数,最多6个变换规则....广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到). 用queue来进行广搜,需 ...

  8. 广度优先搜索——填涂颜色(洛谷 P1162)

    题目选自洛谷P1162 首先讲一下思路:根据题意,当找到第一个1时,其右下必然是圈内的0,那么只要从这个0开始广搜寻找联通块就可以了.(因为圈只有一个,那么当找到第一个1之后便要打断循环,很重要!) ...

  9. 八皇后(例题:洛谷P1219)

    说到八皇后,大一时弄得似懂非懂的,今天刷题刚好碰到类似的,于是誓要把它搞明白,写博客以记之~ 搞懂八皇后问题,对dfs,递归,打标记等知识的理解有很大的帮助. 这是:例题链接 (点它点它点它) 注释写 ...

最新文章

  1. 程序员如何讲清楚技术方案
  2. 实时卷积神经网络实现人脸检测和情感/性别分类
  3. java864位官网_jdk8 64位下载-jdk8 64 bit windows官方版 - 极光下载站
  4. 模板 - 最长上升子序列与最长公共子序列
  5. CVPR 2022 | ConvNeXt - FAIR再探纯卷积结构的极限(优于Transformer)
  6. 智能合约不够安全?微软建专项小组从编程语言入手根治
  7. Android抓包方法(一)之Fiddler代理
  8. Java 洛谷 P1321 单词覆盖还原
  9. 大学生试用期辞退之没有工钱
  10. 为什么Java 中1000==1000为false,而100==100为true?
  11. 火爆全网的迁移学习简明手册全面更新,重磅出版上市!
  12. MyBatis学习(七)
  13. UITableView分割线
  14. Java、前端页面中文乱码解决方式
  15. 数据科学家成长指南(上)
  16. 《美国职业橄榄球大联盟》:NFL·橄榄1号位
  17. 行严格对角占优矩阵——一道矩阵代数作业题
  18. Codeforces Round #613 (Div. 2)(B-D)
  19. 顺序表实现简单的【扑克牌】
  20. LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

热门文章

  1. 【学习笔记-FPGA】verilog语言中assign的使用
  2. 让react支持ie11
  3. element时间选择器限制到时分秒_ElementUI日期选择器时间选择范围限制
  4. 深度学习-正向传播反向传播
  5. 极简主义,风格化与小团队
  6. NEXON旗下的开发工作室
  7. 基于html5 源码,10款基于HTML5+CSS3实现的超酷源码动画
  8. R语言使用rnorm函数生成正太分布数据、使用hist函数可视化直方图、设置freq参数为F显示密度曲线、使用核密度估计函数density(),在直方图上绘制密度曲线
  9. 安装WIN10Ubuntu双系统二三事
  10. 未能加载文件或程序集“ypt_ywgd”或它的某一个依赖项。生成此程序集的运行时比当前加载的运行时新,无法加载此程序集。...