给定一个 N×M 方格的迷宫,迷宫里有 T处障碍,障碍处不可通过。
在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。
这个题目的思路非常简单,就是一个dfs的简单应用。利用dfs一步一步走迷宫,当走到终点就停止,障碍物或者已经走过的格子就不能再走。唯一要注意的是起点的位置也需要标记为已经走过
#include<iostream>
#include<cstdio>
using namespace std;
int sx,sy,fx,fy,n,m,t;
long long ans=0;
int vis[100][100]={0};//存储已经走过的地方
bool ba[100][100]={0};//存储障碍物
int cx[4]={0,0,1,-1};
int cy[4]={1,-1,0,0};//储存xy的移动
void dfs(int x,int y)
{
if(x==fx&&y==fy)
{
ans++;
return;
}
for(int i=0;i<4;i++)
{
int nx=x+cx[i],ny=y+cy[i];
if(vis[nx][ny]!=1&&ba[nx][ny]!=1&&nx>0&&nx<=m&&ny>0&&ny<=n)
{
vis[nx][ny]=1;
dfs(nx,ny);
vis[nx][ny]=0;
}
}
}
int main()
{
cin>>n>>m>>t;
cin>>sx>>sy>>fx>>fy;
vis[sx][sy]=1;
for(int i=0;i<t;i++)
{
int a,b;
scanf("%d%d",&a,&b);
ba[a][b]=1;
}
dfs(sx,sy);
cout<<ans;
return 0;
}