迷宫问题
定义一个二维数组:
它表示一个迷宫,其中的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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
一个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)
思路:搜索题,利用广搜来找最短路径,再开一个数组来记录它的来源,从而把路径打印出来。
代码:
#include<stdio.h> #include<string.h> #include<queue> using namespace std; int map[6][6]; int book[6][6]; int dir[4][2]={0,1,1,0,0,-1,-1,0}; struct node { int x; int y; int step; }; node road[1000][1000];//记录该点的来源 node aa[100]; void print(int xx,int yy) { int a,b,i=0; while(xx!=0||yy!=0)//不等于起点 时就一直找走过的路径 { a=xx,b=yy; aa[i].x=road[a][b].x; aa[i++].y=road[a][b].y; xx=road[a][b].x; yy=road[a][b].y; } i-=1; for(;i>=0;i--) { printf("(%d, %d)\n",aa[i].x,aa[i].y); } printf("(4, 4)\n"); return ; } int judge(int x,int y) { if(x<0||x>4||y<0||y>4||map[x][y]) return 0; return 1; } void bfs(int x,int y) { node now,next; queue<node>q; now.x=x; now.y=y; now.step=0; q.push(now); book[x][y]=1; while(!q.empty()) { now=q.front(); q.pop(); if(now.x==4&&now.y==4) { // printf("%d",now.step);//如果需要输出最少步数,可以在这输出now.step print(4,4);//从终点打印路径 return ; } for(int i=0;i<4;i++) { next.x=now.x+dir[i][0]; next.y=now.y+dir[i][1]; if(judge(next.x,next.y)) { book[next.x][next.y]=1; next.step=now.step+1; q.push(next); road[next.x][next.y].x=now.x; road[next.x][next.y].y=now.y; } } } } int main() { memset(book,0,sizeof(book)); for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { scanf("%d",&map[i][j]); } } bfs(0,0); return 0; }