给定一个迷宫,2代表起点,3代表终端,0不可走,1可走,若有最短距离输出起点到终点最短距离;
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=100+5;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int sr,sc,er,ec;
int n,m;
struct Node{
int r,c,dist;
Node(){}
Node(int r,int c,int dist):r(r),c(c),dist(dist){}
};
int mp[maxn][maxn];//1格可行,0格为障碍
int dist[maxn][maxn];//最小距离
int BFS()
{
queue<Node> Q;
memset(dist,-1,sizeof(dist));
Q.push(Node(sr,sc,0));
dist[sr][sc]=0;
while(!Q.empty())
{
Node x=Q.front();
Q.pop();
for(int i=0;i<4;i++){
int nr=x.r+dx[i];
int nc=x.c+dy[i];
if(nr>=1 && nr<=n && nc>=1 && nc<=m && mp[nr][nc]){
if(dist[nr][nc]==-1 || dist[nr][nc]>dist[x.r][x.c]+1)//状态去重
{
dist[nr][nc]=dist[x.r][x.c]+1;
Q.push(Node(nr,nc,dist[nr][nc]));
if(nr==er && nc==ec) return dist[nr][nc];//到达终点
}
}
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m)==2 && n && m)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&mp[i][j]);//1格可行,0格为障碍
if(mp[i][j]==2)//起点
{
mp[i][j]=1;
sr=i;
sc=j;
}
else if(mp[i][j]==3)//终点
{
mp[i][j]=1;
er=i;
ec=j;
}
}
printf("%d\n",BFS());//输出起点到终点最小距离
}
return 0;
}