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)
走迷宫,输出路径,和走最短路相似,只是用一个数组pre记录前驱点,当走到(4,4)是停止搜索,进行输出,该地图是5*5的,用0-24表示25个位置,用结构体将坐标与线性数字联系起来,输出d[per[x]].x,d[pre[x]].y即可;;
#include <iostream> #include <string.h> using namespace std; int pre[30]; int map[10][10]; struct point { int x,y; }d[30]; void print(int i) { /*for(int j=pre[i];j!=-1;j=pre[j]) cout<<j<<endl;*/ if(pre[i]!=-1) { print(pre[i]); cout<<"("<<d[i].x<<", "<<d[i].y<<")"<<endl; } } int dx[4]={0,1,-1,0}; int dy[4]={1,0,0,-1}; void dfs(int x,int y) { map[x][y]=1; if(x==4&&y==4) { cout<<"(0, 0)"<<endl; print(24); return; } int nx,ny; for(int i=0;i<4;i++) { nx=x+dx[i]; ny=y+dy[i]; if(x>=0&&x<5&&y>=0&&y<5&&map[nx][ny]==0) { pre[nx*5+ny]=x*5+y; dfs(nx,ny); } } } int main() { while(cin>>map[0][0]>>map[0][1]>>map[0][2]>>map[0][3]>>map[0][4]) { for(int i=1;i<5;i++) { for(int j=0;j<5;j++) { cin>>map[i][j]; } } for(int i=0;i<5;i++) for(int j=0;j<5;j++) d[i*5+j].x=i,d[i*5+j].y=j; memset(pre,-1,sizeof(pre)); dfs(0,0); } return 0; }