蓝桥杯dfs模板题--走迷宫整理与反思

题目:
走迷宫
描述

给一个n行m列的2维的迷宫,'S’表示迷宫额起点,‘T’表示迷宫的终点,’#‘表示不能通过的点,’.‘表示可以通过的点。你需要从’S’出发走到’T’,每次只能上下左右走动,并且只能进入能通过的点,每个点只能通过一次。现在要求你求出有多少种通过迷宫的的方案。

输入
第一行输入n,m(1≤n,m≤10)表示迷宫大小。

接下来输入n行字符串表示迷宫。

输出
输出通过迷宫的方法数。

输入样例 1
2 3
S.#
…T
输出样例 1

2

题解:

#include"iostream"
using namespace std;
char a[15][15];
int flag[15][15];
int x[4] = {-1,0,1,0},y[4] = {0,1,0,-1};
int count = 0;
int a1,b1;
int n, m;
void dfs(int a1,int b1){
	if(a[a1][b1] == 'T'){
		count ++;
		return ;
	}
	
	flag[a1][b1] = 1;
	
	for(int i = 0;i < 4;i ++){
		int tx = a1 + x[i];
		int ty = b1 + y[i];
		
		if(tx >= 0 && tx < n && ty >= 0 && ty < m && a[tx][ty] != '#' && flag[tx][ty] != 1){
			dfs(tx,ty);
		}
	}
	
	flag[a1][b1] = 0;
}
int main(){

	cin >> n >> m;
	
	for(int i = 0;i < n;i ++){
		for(int j = 0;j < m;j ++){
			cin >> a[i][j];
			if(a[i][j] == 'S'){
				a1 = i;
				b1 = j;
			}
		}
	}
	
	
	dfs(a1,b1);
	
	cout << count;
	
	return 0;
}

我一开始时这样写的:


#include"iostream"
using namespace std;
char a[15][15];
int x[4] = {-1,0,1,0},y[4] = {0,1,0,-1};
int count = 0;
int a1,b1;
int n, m;
void dfs(int a1,int b1){
	if(a[a1][b1] == 'T'){
		count ++;
		return ;
	}
	
	a[a1][b1] = '*';
	
	for(int i = 0;i < 4;i ++){
		int tx = a1 + x[i];
		int ty = b1 + y[i];
		
		if(tx >= 0 && tx < n && ty >= 0 && ty < m && a[tx][ty] != '#'){
			dfs(tx,ty);
		}
	}
	
	a[a1][b1] = '.';
}
int main(){

	cin >> n >> m;
	
	for(int i = 0;i < n;i ++){
		for(int j = 0;j < m;j ++){
			cin >> a[i][j];
			if(a[i][j] == 'S'){
				a1 = i;
				b1 = j;
			}
		}
	}
	
	
	dfs(a1,b1);
	
	cout << count;
	
	return 0;
}

反思:
这次刷模板题,忽略了一个地方那就是 标记数组的创建,让我 懵比 了一上午,那么为啥要用到这个标记数组呢?换个角度想一想,不用会怎样?
从运行的角度来看,压根不能成功运行这个程序,如图:
在这里插入图片描述
但是实质的问题出在哪里呢?通过对样例的分析,我发现我真正的错误不是出在了标记数组,而是在这里我少了一个限制条件23333
在这里插入图片描述
我出错的代码就是因为 没有把之前如果走过的那些 就不能走了,这个限制条件加上,功夫不负有心人,我还是懂了,哈哈哈

接下来我就再整理一下,dfs做题的大体框架

int xx[4] = {-1,0,1,0},yy[4] = {0,1,0,-1}; // 上 右 下 左

void dfs(int x,int y){
	if(x,y是终点){
		count ++;  // 计数,返回输出等等
		return ;
	}
	a[x][y] = '#'; //标记(x,y)已经访问了
	//接下来上下左右循环深搜
	for(i = 0;i < 4;i ++){//这种遍历的格式很多,个人喜欢这种
		int tx = x + xx[i];
		int ty = y + yy[i];
		if(){// tx 和 ty 都没有访问过且满足一写必要的条件,则继续往下深搜
			dfs(tx,ty);
		} 
	}
	a[x][y] = '.';  // 解除标记,因为已经到底了,然后从底部依次往上解除标记
}

int main(){
	//第一步 输入一些数 数组的值
	//第二步 找到起点终点,调用dfs函数
	//第三步 根据所求的值,设置条件语句等进行判断输出
	return 0;
}


宝剑锋从磨砺出,梅花香自苦寒来

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rabbit Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值