洛谷p1141 01迷宫

本文详细记录了解决洛谷P1141 01迷宫问题的过程,重点讨论了搜索算法的实现细节,包括误以为起点不计入答案和询问次数优化的误区,以及输入处理的正确方式。通过使用记忆化搜索避免重复计算,实现了高效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洛谷p1141 01迷宫

这道题提交了好多遍终于A了,bfs和dfs都提交好几遍都过不了(各种细节和输入的问题),必须单独开一篇博客来叨叨。
首先这道题的搜索并不难,但是要注意细节,他问的是能到达的格子(包括自身),一开始我以为包括自身是走了一圈回来再到达所以我vis一开始没有赋值而且ans是赋值为0,其实是站在那里就算是一个了,所以开始bfs之vis[x][y]要赋值为true(即已访问),然后ans赋值为1.
然后是最难的一个点,就是询问的次数,这道题询问的次数多达100000,如果每一次询问再暴力搜索肯定是超时的,所以要用记忆化搜索,在每一次bfs搜索时用一个vector数组存放经过的点(联通点),而这些联通点能到达格子的个数是相同的,只要在一次搜索之后将最后到达格子个数的值赋给这些点,然后在每一次询问时,看看该点是否访问过,如果没有访问过就再搜索一次最后输出值。
还有这道题的输入,我一开始是这样输入的,然后就一直过不了(因为自己电脑测试例子也是正确的,所以没想到是这里出错)

char ch ; 
	scanf ("%d%d",&n,&m) ; 
	getchar() ; 
	for (int i = 1 ; i <= n ; i ++){
   
		for (int j = 1 ; j <= n ; j ++){
   
			ch = getchar() ; 
			maze[i][j] = ch - '0' ; 
		}
		getchar() ; 
	}

要改成这样

scanf ("%d%d",&n,&m) ; 
	for (int i = 1 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值