题目描述
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。
给定起点坐标和终点坐标。如下图所示:
问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
输入格式
第一行N、M和T,N为行,M为列,T为障碍总数。
第二行起点位置(SX,SY),终点位置(FX,FY)。
接下来T行,每行为障碍点的坐标。
输出格式
给定起点位置和终点位置,问每个方格最多经过1次,从起点到终点的方案总数。
样例 #1
样例输入 #1
5 5 7
1 1 5 5
1 2
2 2
3 2
4 2
2 4
4 4
5 4
样例输出 #1
2
提示
对于 100% 的数据,1≤N,M≤51,1≤T≤10,1≤SX,FX≤n,1≤SY,FY≤m。
#include<bits/stdc++.h>
using namespace std;
const int N=50;
const int Len=4;
const int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
char g[N][N];
bool vis[N][N];
int dis[N][N],idx,n,m;
struct Node
{
int x,y;
};
void bfs(int x,int y)//用队列作迷宫bfs
{
queue<Node> q;
Node cur;
q.push((Node){x,y});
vis[x][y]=idx;//初始化
dis[x][y]=1;//初始化
int nx,ny;
while(!q.empty())//直到队列为空为止
{
cur=q.front();//备份
q.pop();
for(int i=0;i<=Len-1;++i)//枚举四个方向
{
nx=dx[i]+cur.x;
ny=dy[i]+cur.y;
if(nx<1 || nx>n || ny<1 || ny>m)//判断越界
{
continue;
}
if(g[nx][ny]=='#')//判断是否为障碍
{
continue;
}
if(vis[nx][ny])//判断是否走过
{
continue;
}
q.push((Node){nx,ny});
vis[nx][ny]=true;//标记为走过
dis[nx][ny]=dis[cur.x][cur.y]+1;记录答案
}
}
return;
}
int main()
{
int i,j;
cin>>n>>m;
for(i=1;i<=n;++i)for(j=1;j<=m;++j)
{
cin>>g[i][j];
}
bfs(1,1);//dfs枚举迷宫
cout<<dis[n][m];//输出答案
return 0;
}