一篇文章带你快速入门DFS深度优先搜索

目录

深度优先搜索:

框架展示:

例一、中国象棋

例二、迷宫

例三、迷宫解的方案数

例四、最大的蛋糕块

例五、家谱

例六、马的覆盖点

例七、王子救公主

例八、开公司


深度优先搜索:

深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

框架展示:

一篇文章带你快速入门DFS深度优先搜索_第1张图片

例一、中国象棋

题目描述:

一篇文章带你快速入门DFS深度优先搜索_第2张图片

一篇文章带你快速入门DFS深度优先搜索_第3张图片

一篇文章带你快速入门DFS深度优先搜索_第4张图片

代码如下:

#include
char map[10][10];
bool f;
int visited[10][10];          //字符串长度为9,至少要开10的长度,因为有'\0'
int dir[8][2]={
    {-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
bool in(int x,int y){        //判断是否在棋盘内
	if(x>=0&&x<10&&y>=0&&y<9)
		return true;
	return false;
}
void dfs(int x,int y){
	visited[x][y]=1;    //标记已访问
	if(f){              //已跳到马需要跳到的位置 
		return;
	}
	if(map[x][y]=='T'){ //找到马需要跳到的位置   
		f=true;
		return;
	}
	for(int i=0;i<8;++i){        
		int tx=x+dir[i][0];
		int ty=y+dir[i][1];
		if(in(tx,ty)&&map[x][y]!='#'&&!visited[tx][ty])
			dfs(tx,ty);
	}
}
int main(){
	int x,y;
	for(int i=0;i<10;++i)
		scanf("%s",map[i]);
	for(int i=0;i<10;++i){
		for(int j=0;j<9;++j){
			if(map[i][j]=='S'){
				x=i;
				y=j;
				break;
			}
		}	
	}
	dfs(x,y);
	if(f)
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}

运行结果:

一篇文章带你快速入门DFS深度优先搜索_第5张图片

例二、迷宫

题目描述:

一篇文章带你快速入门DFS深度优先搜索_第6张图片

输入:

第一行为行列数n和m

其余n行输入n*m的地图

输出:

迷宫起点到终点最短路径 

代码如下:

#include
#include 
using namespace std;
int n,m;
int ans=10000000;
string maze[110];
bool visited[110][110];
int dire[4][2]={
    {0,-1},{-1,0},{0,1},{1,0}};
bool in(int x,int y){
	if(x>=0&&x=0&&y>n>>m;
	for(int i=0;i>maze[i];
	int x,y;
	for(int i=0;i

 运行结果:

一篇文章带你快速入门DFS深度优先搜索_第7张图片

例三、迷宫解的方案数

题目描述:

一篇文章带你快速入门DFS深度优先搜索_第8张图片

输出:

从起点到达终点的路径的条数

代码如下:

#include
int n,m,x,y,ans;
char map[15][15];
bool visited[15][15];
void dfs(int x,int y){
	if(x<0||x>=n||y<0||y>=m||visited[x][y]||map[x][y]=='#')
		return;
	if(map[x][y]=='e'){
		++ans;
		return;
	}
	visited[x][y]=1;
	dfs(x-1,y);
	dfs(x+1,y);
	dfs(x,y-1);
	dfs(x,y+1);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i

运行结果:

一篇文章带你快速入门DFS深度优先搜索_第9张图片

例四、最大的蛋糕块

题目描述:

一篇文章带你快速入门DFS深度优先搜索_第10张图片

输入:

第一行为蛋糕的行列数n,m

其余n行为蛋糕

输出:

蒜头君最大可以吃到的蛋糕占据的网格数

代码如下:

#include
int n,m,cnt,ans;
char map[1005][1005];
bool visited[1005][1005];
void dfs(int x,int y){
	if(x<0||x>=n||y<0||y>=m||visited[x][y]||map[x][y]=='.')
		return;
	visited[x][y]=1;
	++cnt;
	dfs(x-1,y);
	dfs(x+1,y);
	dfs(x,y-1);
	dfs(x,y+1);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;ians)
					ans=cnt;
			}
		}
	}
	printf("%d\n",ans);
} 

运行结果:

一篇文章带你快速入门DFS深度优先搜索_第11张图片

例五、家谱

题目描述:

一篇文章带你快速入门DFS深度优先搜索_第12张图片

一篇文章带你快速入门DFS深度优先搜索_第13张图片

输出:

输出n行,每行有一个整数,表示第i个人有多少个直系后代

代码如下:

#include
#include 
using namespace std;
vector son[100005];
int ans[100005];
bool f[100005];
int dfs(int u){
	int ret=0;
	for(int i=0;i

运行结果:

一篇文章带你快速入门DFS深度优先搜索_第14张图片

另附(vector讲解):

竞赛常用STL内置函数用法解析——六、vector

例六、马的覆盖点

题目描述:

一篇文章带你快速入门DFS深度优先搜索_第15张图片

输入:

第一行输入两个整数 n (1 ≤ x ≤ 100), m(1≤ m ≤ 100) 代表棋盘行和列的大小。
第二行输入两个整数 x (1 ≤ x ≤ n), y (1 ≤ y ≤ m) 代表马开始所的位置。

输出:

输出整个棋盘,'.'代表棋盘上可以落子的点。'#'这个代表马三步能到达的点。

代码如下:

#include
char s[105][105];
int n,m;
int dir[8][2]={
    {-2,-1},{-2,1},{2,-1},{2,1},{1,2},{1,-2},{-1,2},{-1,-2}};
void dfs(int x,int y,int step){
	if(step>3)
		return;
	if(x<0||x>=n||y<0||y>=m)
		return;
	s[x][y]='#';
	for(int i=0;i<8;++i)
		dfs(x+dir[i][0],y+dir[i][1],step+1);
}
int main(){
	int x,y;
	scanf("%d%d%d%d",&n,&m,&x,&y);
	for(int i=0;i

运行结果:

一篇文章带你快速入门DFS深度优先搜索_第16张图片

例七、王子救公主

题目描述:

一篇文章带你快速入门DFS深度优先搜索_第17张图片

一篇文章带你快速入门DFS深度优先搜索_第18张图片

代码如下:

#include
int n,m;
char map[105][105];
bool visited[105][105][2];
void dfs(int x,int y,int d){
	if(x<0||x>=n||y<0||y>=m||visited[x][y][d]||map[x][y]=='#')
		return;
	visited[x][y][d]=1;
	dfs(x-(2-d),y,d);
	dfs(x+(2-d),y,d);
	dfs(x,y-(2-d),d);
	dfs(x,y+(2-d),d);
}
int main(){
	int x,y;
	bool ans;
	scanf("%d%d",&n,&m);
	for(int i=0;i

运行结果:

一篇文章带你快速入门DFS深度优先搜索_第19张图片

例八、开公司

题目描述:

一篇文章带你快速入门DFS深度优先搜索_第20张图片

代码如下:

#include
int task[15][15];
bool visited[15];
int n,ans;
void dfs(int x,int t){
	if(x==n){
		if(t

运行结果:

一篇文章带你快速入门DFS深度优先搜索_第21张图片

另附(此题类似于蓝桥杯:组队):

蓝桥杯真题详细题解——持续更新

 

你可能感兴趣的:(DFS,dfs,算法)