洛谷P1605思路与题解

题目传送门

这是一道很经典的DFS题,题目大意就是从起点到终点有几条路可走,但注意要避开障碍。

在这道题中,可以看作有三个“障碍”,我们一一想办法解决:

        1.迷宫的“墙”,也就是数组的边界。可以判断每一步有没有小于等于0或大于题目中的m,n。

        2.迷宫中的障碍物,也就是输入数据中第三行到第(2+T)行的坐标。用 p[i][j]=1 表示点(i,j)为障碍物,判断每一步所在的数是否为1。

        3.之前已经走过的方格,因为题目中有 “每个方格最多经过一次” 的条件。走过的点用 f[i][j]=true 表示,每走一步判断即可。

        ●此外,对于方格图,我们通常用dx,dy数组记录每一步能走的方向。

        ●对于之前的DFS题,我们都是在决策本层的状态时记录信息,在回溯回该层时复原。而这道题我们采用一种新的遍历方式,在走进下一层时标记,在即将离开该层时(即DFS的最后)复原。

        附上AC代码

#include<bits/stdc++.h>
using namespace std;
int ans;
int p[6][6];
bool f[6][6];
int dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
int n,m,t;
int sx,sy,fx,fy;
void dfs(int x,int y){
	if(x==fx&&y==fy){
		ans++;
		return;
	}
	f[x][y]=true;
	for(int i=0;i<4;i++){
		if(x+dx[i]>0&&x+dx[i]<=n&&y+dy[i]>0&&y+dy[i]<=m&&p[x+dx[i]][y+dy[i]]==0&&f[x+dx[i]][y+dy[i]]==false){//判断是否越界,是否重复走过,以及是否有障碍物 
			dfs(x+dx[i],y+dy[i]);
		}
	}
	f[x][y]=false;
}
int main()
{
	scanf("%d%d%d",&n,&m,&t);
	scanf("%d%d%d%d",&sx,&sy,&fx,&fy);
	f[sx][sy]=true;//表示起点已经走过 
	for(int i=1;i<=t;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		p[x][y]=1;//标记障碍物 
	}
	dfs(sx,sy);
	cout<<ans<<endl;
	return 0;
}

        感谢阅读!欢迎dalao来踩

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值