<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;">迷宫问题</span></span>
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 9718 | Accepted: 5742 |
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)
用DFS做的。。。
#include<stdio.h> int map[10][10]; int book[10][10]; int tx,ty; int next[4][2]={{1,0},{0,1},{0,-1},{-1,0}}; bool isbound(int x,int y) { if(x<0||y<0||x>=5||y>=5) { return 1; } else { return 0; } } void dfs(int x ,int y) { int k; if(x==0&&y==0) { return ; } for(k=0;k<4;k++) { tx=x+next[k][0]; ty=y+next[k][1]; if(isbound(tx,ty)) { continue; } if(map[tx][ty]==0) { if(book[x][y]+1<book[tx][ty]) { book[tx][ty]=book[x][y]+1; dfs(tx,ty); } } } } void Printf(int x,int y,int step) { int i,j; if(step==2) { return ; } else { int k; for(k=0;k<4;k++) { tx=x+next[k][0]; ty=y+next[k][1]; if(isbound(tx,ty)) { continue; } if(map[tx][ty]==0) { if(book[x][y]-1==book[tx][ty]) { printf("(%d, %d)\n",tx,ty); Printf(tx,ty,step-1); break; } } } } } int main() { int i,j,k; int step; for(i=0;i<5;i++) { for(j=0;j<5;j++) { scanf("%d",&map[i][j]); book[i][j]=30; } } book[4][4]=1; dfs(4,4); // 查看 book // for(i=0;i<5;i++) // { // for(j=0;j<5;j++) // { // printf("%3d ",book[i][j]); // } // printf("\n"); // } printf("(0, 0)\n"); Printf(0,0,book[0][0]); printf("(4, 4)"); return 0; }