迷宫最短路【广搜】

要求:

      输入行数为n列数为m的迷宫,用‘s’表示起点,‘#’表示墙头,输出起点到各点的最短路。

sample input:

5 5

s#...

.#...

.#...

.....

..#..

sample output:

0 0 8 9 10

1 0 7 0 9

2 0 6 0 8

3 4 5 6 7

4 5 0 7 8

 

code:

View Code
#include<stdio.h>
#include<string.h>
int dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
int q[100000];
int maze[200][200];
int vis[200][200];
int dist[200][200];
char map[200][200];
int n,m;
void bfs(int x,int y)
{
int front=0,rear=0,d,u;
u=x*m+y;
vis[x][y]=1;
dist[x][y]=0;
q[rear++]=u;
while(front<rear)
{
u=q[front++];
x=u/m;y=u%m;
for(d=0;d<4;d++)
{
int nx=x+dx[d],ny=y+dy[d];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]&&!vis[nx][ny])
{
int v=nx*m+ny;
q[rear++]=v;
vis[nx][ny]=1;
dist[nx][ny]=dist[x][y]+1;
}
}
}
}
int main()
{
int i,j,x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(maze,0,sizeof(maze));
memset(vis,0,sizeof(vis));
memset(dist,0,sizeof(dist));
memset(q,0,sizeof(q));
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
for(j=0;j<m;j++)
{
if(map[i][j]=='.')
maze[i][j]=1;
else if(map[i][j]=='s')
{x=i;y=j;}
}
}
bfs(x,y);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
printf("%d%c",dist[i][j],(j==m-1)?'\n':' ');

}
}


posted @ 2012-03-15 12:36  'wind  阅读(254)  评论(0编辑  收藏  举报