码迷,mamicode.com
首页 > 其他好文 > 详细

迷宫问题

时间:2016-09-17 07:04:24      阅读:161      评论:0      收藏: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)

分析:

这题可以用宽搜来做;

我使用了二维的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];//回溯上一次
}
   for(int i=c;i>=2;i--){
   cout<<"("<<dl[0][count[i]]<<", "<<dl[1][count[i]]<<")"<<endl;//将除最后一步全部输出
}
   cout<<"(4, 4)"<<endl;//输出终点
   return 0;
}

参考:http://www.cnblogs.com/caotongyu/p/5866802.html

迷宫问题

标签:

原文地址:http://www.cnblogs.com/qswx/p/5877808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!