迷宫~哈哈~终于懂了BFS
输入m,n表示m*n的迷宫,接下来m*n行表示迷宫,用1表示路,0表示墙。输出左上角到右上角最少步数及走法.
输入:
5 5
1 0 1 1 1
1 0 1 0 1
1 0 1 0 1
1 1 1 1 1
1 0 0 1 1
输出:
minimum steps:8
<0,0><1,0><2,0><3,0><3,1><3,2><2,2><1,2><0,2><0,3><0,4>
核心在于BFS
在走迷宫时,其重要在于一层一层走并记录每层的最短距离下面用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; }