在走迷宫时,其重要在于一层一层走并记录每层的最短距离下面用dist[x][y]表示,而x*n+y就是标号[x][y]的编号,用fa[x][y]记录它父节点的编号
dx[4]与dy[4]用于向四周搜索,用vis[x][y]记录是否走过。代码如下:
#include<stdio.h>
#include<string.h>
int a[110][110],vis[110][110]={0},fa[110][110];
int dist[110][110];int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
int q[110*110];
int m,n;
int key=1;
void bfs(int x,int y)
{
memset(vis,0,sizeof(vis));memset(fa,0,sizeof(fa));
memset(dist,0,sizeof(dist));memset(q,0,sizeof(q));
int u=x*n+y;fa[x][y]=u;
vis[x][y]=1;dist[x][y]=0;
int front=0,rear=1;
q[front]=u;
while(front<rear)
{
u=q[front++];
int x=u/n,y=u%n;
for(int i=0;i<4;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(!vis[nx][ny]&&a[nx][ny]&&nx>=0&&nx<m&&ny>=0&&ny<n)
{
vis[nx][ny]=1;
int v=nx*n+ny;
q[rear++]=v;
dist[nx][ny]=dist[x][y]+1;
fa[nx][ny]=u;
}
}
}
}
void print(int x,int y)
{
if(!x&&!y)
{
printf("minimum steps:%d\n",dist[m-1][n-1]);
printf("<%d,%d>",x,y);
}
else{
int a=fa[x][y]/n,b=fa[x][y]%n;
print(a,b);
printf("<%d,%d>",x,y);
}
}
void printt()
{
printf("Case %d:\n",key++);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
printf("%d%c",a[i][j],j==n-1?'\n':' ');
}
int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&m,&n))
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
bfs(0,0);
// printt();
print(m-1,n-1);
printf("\n\n");
}
return 0;
}