标签:
描述
定义一个二维数组:
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)
分析:
这题可以用宽搜来做;
我使用了二维的dl数组,分别为行坐标,列坐标和前点;
在输出是我用了数组记录,将正确路径的路标倒序记录在count数组中,最后倒序输出即可;
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<cstdlib>
using namespace std;
int tu[6][6];
int c=1,k,f,p;
int count[1111111];//记录数组
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
int dl[3][111111];//行,列,前点
bool flag=true;
int main(){
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
cin>>tu[i][j];//读入地图
tu[0][0]=0;
dl[0][1]=0;
dl[1][1]=0;
dl[2][1]=0;
f=1;
p=2;
while(f<p&&flag){
int h=dl[0][f];
int l=dl[1][f];
for(int i=0;i<4;i++){//路径枚举
int x=h+dx[i];
int y=l+dy[i];
if(x>=0&&x<5&&y>=0&&y<5&&tu[x][y]==0){//可行性判断
dl[0][p]=x;
dl[1][p]=y;
dl[2][p]=f;//记录前点
tu[x][y]=1;//封闭该点
if(x==4&&y==4){//如果到达终点
flag=false;
break;//跳出循环
}
p++;
}
}
f++;
}
k=dl[2][p];//记录最后一点
while(k>0){
count[++c]=k;//存入数组
k=dl[2][k