Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
可能代码有点乱,求不喷。。。
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define INF 0x3f3f3f3f #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1| 1 using namespace std; typedef long long LL; const int maxn = 10; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; int n,map[maxn][maxn],vis[maxn][maxn],fa[maxn][maxn],fb[maxn][maxn],q[maxn*maxn]; void dfs() { int front=0,rear=0,u,x=0,y=0; u=x*5+y; fa[x][y]=u; q[rear++]=u; vis[x][y]=u; while(front<rear) { u=q[front++]; x=u/5; y=u%5; for(int i=0;i<4;i++) { int fx=x+dx[i],fy=y+dy[i]; if(fx>=0&&fx<5&&fy>=0&&fy<5&&!map[fx][fy]&&!vis[fx][fy]) { int v=fx*5+fy; q[rear++]=v; fa[fx][fy]=u; vis[fx][fy]=1; } } } } int main() { memset(map,0,sizeof(map)); memset(vis,0,sizeof(vis)); memset(fa,0,sizeof(fa)); memset(fb,0,sizeof(fb)); for(int i=0;i<5;i++) for(int j=0;j<5;j++) scanf("%d",&map[i][j]); dfs(); int anx=4,any=4,cnt=1; int ans[30]; while(anx||any) { ans[cnt]=fa[anx][any]; int m=fa[anx][any]/5; int n=fa[anx][any]%5; anx=m; any=n; cnt++; } for(int i=cnt-1;i>=1;i--) printf("(%d, %d)\n",ans[i]/5,ans[i]%5); printf("(4, 4)\n"); return 0; }