描述
定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
输入
一个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
样例输出
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
解题分析
这道题如果只是要得到答案的话其实并不难,困难的点在于我们必须要记住我们选择的路径并且依次输出,这就需要额外的两个path数组,一个用来记录当前我们走的路径,一个用来存储最优路径,最后输出最优路径答案即可。 由于整个题目的数量级非常的小,所以DFS或者BFS都是可以解决问题的。
代码演示
#include <iostream>
using namespace std;int maze[5][5];
bool visited[5][5]={0};struct Node{int x,y;
};Node path[25];
Node bestpath[25];int minlen=1<<30;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int depth=0;void dfs(int x,int y){if(depth>minlen) return;if(x==4 && y==4){path[depth]={x,y};if(depth<minlen){minlen=depth;for(int i=0;i<=minlen;i++){bestpath[i]=path[i];}}}path[depth]={x,y};depth++;visited[x][y]=1;for(int i=0;i<4;i++){int x1=x+dx[i],y1=y+dy[i];if(x1>=0 && x1<5 && y1>=0 && y1<5 && maze[x1][y1]==0 && !visited[x1][y1]){dfs(x1,y1);}}visited[x][y]=0;depth--;
}int main(){for(int i=0;i<5;i++)for(int j=0;j<5;j++){scanf("%d",&maze[i][j]);}dfs(0,0);for(int i=0;i<=minlen;i++){printf("(%d, %d)\n",bestpath[i].x,bestpath[i].y);}return 0;
}