迷宫问题求解

一、目的

1、进一步理解和掌握各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法。

2、掌握分析问题,求解问题的方法并提高设计编程实现的能力。

3、熟练掌握C语言或者C++语言的各种操作,制定清晰的程序流程图和数据结构的详细定义。

二、实验具体内容

1、用回溯法求解迷宫问题,可以用一个栈保存探索的位置。并且在该迷宫的行走中,站在一点可以有四个方向选择,依次判断四个方向是否能走。

2、定义一个固定格式(10*10)迷宫如下:

{   0,1,1,1,0,0,0,0,0,0,

0,0,0,1,0,0,0,1,0,0, 

0,1,0,1,1,0,0,1,0,0, 

0,1,0,0,1,0,1,1,0,0, 

0,1,0,0,1,0,1,1,0,0, 

1,1,1,0,1,0,1,0,0,0, 

0,0,1,0,0,0,1,0,1,1, 

0,0,1,0,0,0,1,0,1,1, 

0,1,1,0,1,0,1,0,0,0, 

0,0,0,0,1,0,1,1,0,0,   };

 

3、并设置左上角(0,0)为入口,右下角(9,9)为出口,0表示通路,1表示有墙。

4、用二维数组MAZE[x][y] 来表示迷宫的状态,0表示通路,1表示有墙,2表示已经走过。

5、用STL的栈储存走过的路径,压栈表示进入下一步,退栈表示返回上一步。每个栈元素是当前位置坐标被结构体对象包装产生的。

三、分析

首先要考虑如何判断行进方向,并且确定下一个方向可以走,再考虑如何判定走过的路,这里我采用的是将其值设置为2,然后每走一步就将这个位置包装起来压栈,假如无法再继续行走的话就进行回溯,相当于原路返回,伴随的还有之前压入的错误路径的栈元素要出栈,反复进行从而将所有正确位置压入栈中,由栈底往栈顶遍历,从而输出正确路径。

四、代码

结构体定义:

struct pos{ 

    int i,j; 

}; 

方向判定:

判断是否有通路,有则返回通路位置,无则返回原来位置 

//向上  

    if(判定是否是通路且是否在迷宫范围之内且是否已经走过了){ 

          执行位置变动和将此位置标记为已走,返回下个位置 

    }//向右

else if(判定是否是通路且是否在迷宫范围之内且是否已经走过了){ 

                执行位置变动和将此位置标记为已走,返回下个位置

    }//向下

else if(判定是否是通路且是否在迷宫范围之内且是否已经走过了){ 

                执行位置变动和将此位置标记为已走,返回下个位置

    }//向左

else if(判定是否是通路且是否在迷宫范围之内且是否已经走过了){ 

                执行位置变动和将此位置标记为已走,返回下个位置 

    } 

    否则返回上一个位置。

 

数据结构操作:

stack<struct pos> Path; 

    声明两个结构体对象curr,nex; 

    将接收入栈元素的结构体对象curr初始化为入口元素,i=0,j=0;

    将入口元素入栈;

将入口(0,0)设置成走过的位置;

    while(判断栈是否为空){ 

        curr=栈顶; 

        nex=curr; 

       nex=Move(curr);//将curr传入Move函数判断方向并行走,从而发现通路返回下个位置或者没有发现通路返回上个位置 

       if(!(curr.i==nex.i&&curr.j==nex.j)) 

            发现通路,将nex压入栈顶;

        else 

            未发现通路,将栈顶出栈;

        if(判断nex是否到达出口(9,9)){ 

            struct posroute[Path.size()]; 

            intz=0; 

            while(判断栈时候为空,不空执行下列程序,空则跳出){ 

                curr=栈顶元素;

                将栈顶元素放入route结构体类型数组中;

                栈顶出栈,以便下次操作;

            } 

            for(intk=z-1;k>=0;k--){ 

                按规格输出路径;

            } 

            return; 

        } 

    } 

   cout<<"NO Path!"<<endl;

主函数:自行想象.......

五、运行结果

迷宫如下:

0 1 1 1 0 0 0 0 0 0

0 0 0 1 0 0 0 1 0 0

0 1 0 1 1 0 0 1 0 0

0 1 0 0 1 0 1 1 0 0

0 1 0 0 1 0 1 1 0 0

1 1 1 0 1 0 1 0 0 0

0 0 1 0 0 0 1 0 1 1

0 0 1 0 0 0 1 0 1 1

0 1 1 0 1 0 1 0 0 0

0 0 0 0 1 0 1 1 0 0

 

则路径为:

(0,0)->(1,0)->(1,1)->(1,2)->(2,2)

->(3,2)->(3,3)->(4,3)->(5,3)->(6,3)

->(6,4)->(6,5)->(5,5)->(4,5)->(3,5)

->(2,5)->(1,5)->(0,5)->(0,6)->(0,7)

->(0,8)->(0,9)->(1,9)->(2,9)->(3,9)

->(4,9)->(5,9)->(5,8)->(5,7)->(6,7)

->(7,7)->(8,7)->(8,8)->(8,9)->(9,9)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序在VC++ 6下顺利编译通过。 一、 实验目的: (1) 熟练掌握链栈的基本操作及应用。 (2) 利用链表作为栈的存储结构,设计实现一个求解迷宫的非递归程序。 二、实验内容: 【问题描述】 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对信任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【基本要求】 首先实现一个链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),……。 【测试数据】 迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 以方阵形式输出迷宫及其通路。 输出: 请输入迷宫的长和宽:5 5 请输入迷宫内容: 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 迷宫的路径为 括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向) (1,1,1,↓) (2,1,2,→) (2,2,1,↓) (3,2,1,↓) (4,2,2,→) (4,3,1,↓) (5,3,2,→) (5,4,2,→) (5,5,0,) 迷宫路径探索成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值