C++DFS算法(洛谷B3625 迷宫寻路)

DFS全称深度优先搜索,如下图

DFS的遍历为A->B->D->E->C->F->G,这是DFS遍历二叉树的顺序。

例如这道题题洛谷B3625迷宫寻路,这道题可用DFS,BFS,这里使用DFS。

首先说明一下题解变量意义:

int n,m,a[200][200];
int dx[] = {1,0,-1,0},dy[] = {0,1,0,-1};

n,m表示终点坐标,dx,dy表示一个点的下一步的四种走法对x,y的变化。

递归函数最重要的就是退出条件(这个很容易忘记写)

if(x ==  n && y == m){
    f == true;
    return;
}

如果当前点的已经到达终点就可以退出了(这里的f表示是否到达终点与最后答案有关)

for(int i = 0;i < 4;++i){
	int x2 = x + dx[i],y2 = y + dy[i];
	if(x2 > 0 && x2 <= n && y2 > 0 && y2 <= m){
		if(a[x2][y2] == 0){
			dfs(x2,y2);
		}
	}
}

x2,y2表示当前点的坐标,上一个点判断有没有走出去,如果下一个点没有障碍(a[x2][y2] == 0)即到达下一个点。

在主函数中预处理时将如果遇见障碍将a[i][j] = 1表示a[i][j]是障碍不能通行;

for(int i = 1;i <= n;++i){
	for(int j = 1;j <= m;++j){
		cin >> l;              //l是 char类型的
		if(l == '#'){
			a[i][j] = 1;
		}
	}
}

加上特判如果起点或终点是障碍那么不能到达终点

AC代码:

#include <iostream>
using namespace std;
int n,m,a[200][200];
int dx[] = {1,0,-1,0},dy[] = {0,1,0,-1};
bool f = false;
char l;
void dfs(int x,int y){
	if(x == n & y == m){
		f = true;
		return;
	}
	a[x][y] = 1;
	for(int i = 0;i < 4;++i){
		int x2 = x + dx[i],y2 = y + dy[i];
		if(x2 > 0 && x2 <= n && y2 > 0 && y2 <= m){
			if(a[x2][y2] == 0){
				dfs(x2,y2);
			}
		}
	}
}
int main(){
	cin >> n >> m;
	for(int i = 1;i <= n;++i){
		for(int j = 1;j <= m;++j){
			cin >> l;
			if(l == '#'){
				a[i][j] = 1;
			}
		}
	}
	if(a[1][1] == 1 || a[n][m] == 1){
		cout << "No";
		return 0;
	}
	dfs(1,1);
	if(f == true){
		cout << "Yes";
	}else{
		cout << "No";
	}
	
	return 0;
}

如果可以请点一个免费的赞吧,谢谢!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值