这是一道很经典的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来踩