二十四周项目二--回溯法之走迷宫

问题:

代码:

#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;

#define MaxSize 100
int maze[10][10] =   //定义一个迷宫,0表示通道,1表示墙
{
    {1,1,1,1,1,1,1,1,1,1},
    {1,0,0,1,1,0,0,1,0,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,0,0,1,1,0,0,1},
    {1,0,1,1,1,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,0,0,1,0,0,1},
    {1,0,1,1,1,0,1,1,0,1},
    {1,1,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};

struct Try //定义一个栈,保存路径
{
    int i;               //当前方块的行号
    int j;               //当前广场的列号
    int d;              //di是下一可走方位的方位号
} path[MaxSize];         //定义栈

int top = -1;            //初始化栈指针

void findPath(int xb, int yb, int xe, int ye)            //路径为从(xb,yb)到(xe,ye)
{
    int i, j, d, find, k;
    top++;                                             //初始方块进栈
    path[top].i = xb;
    path[top].j = yb;
    path[top].d = -1;
    maze[xb][yb] = -1;
    while(top>-1)                                      //栈不为空时循环
    {
        i = path[top].i;
        j = path[top].j;
        d = path[top].d;
        if(i==xe && j==ye)                             //找到了出口,输出路径
        {
            cout << "迷宫路径如下:\n";
            for(k=0; k<=top; k++)
            {
                cout << "\t(" << path[k].i << "," << path[k].j << ")";
                if((k+1)%5==0) cout << endl;            //每输出五个方块后换一行
            }
            cout << endl;
            return;
        }
        find = 0;
        while(d<4 && find==0)                          //找下一个可走的点
        {
            d++;
            switch(d)
            {
            case 0:  //向上
                i = path[top].i-1;
                j = path[top].j;
                break;
            case 1: //向右
                i = path[top].i;
                j = path[top].j+1;
                break;
            case 2:  //向下
                i = path[top].i+1;
                j = path[top].j;
                break;
            case 3:  //向左
                i = path[top].i;
                j = path[top].j-1;
                break;
            }
            if(maze[i][j]==0) find = 1;                      //找到通路
        }
        if(find==1)                                        //找到了下一个可走方块
        {
            path[top].d = d;                               //修改原栈顶元素的d值
            top++;                                         //下一个可走方块进栈
            path[top].i = i;
            path[top].j = j;
            path[top].d = -1;
            maze[i][j] = -1;                                 //避免重复走到这个方块
            //cout << "\t(" << path[top].i << "," << path[top].j << ")"; //显示经过的试探
        }
        else  //没有路可走,则退栈
        {
            maze[path[top].i][path[top].j] = 0;                  //让该位置变成其它路径可走方块
            top--;
        }
    }
    cout << "没有可走路径!\n";
}

int main()
{
    findPath(1,1,8,8);  //从(1,1)入,(8,8)出
    return 0;
}
运行结果:
<img src="http://img.blog.csdn.net/20150221222920057?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenM5NTI4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
时间: 2024-12-29 07:16:29

二十四周项目二--回溯法之走迷宫的相关文章

二十四周项目一--哈希法存储与查找

哈希法: 实例: #include <iostream> using namespace std; int searchHash(int h[], int l, int key); void insertHash(int h[], int l, int data); int main() { const int hashLength = 13;//哈希表长度 int hashTable[hashLength]={0}; int m, n; //创建hash for (int i = 0; i

第二十四周项目2-回溯法走迷宫

问题: 迷宫问题中,在寻找路径时,采用的方法通常是:从入口出发,沿某一方向向前试探,若能走通,则继续向前进:如果走不通,则要沿原路返回,换一个方向再继续试探,直到所有可能的能跟都试探完成为止.为了保证在任何位置上都能沿原路返回(回溯),要建立一个后进先出的栈来保存从入口到当前位置的路径. 而且在求解迷宫路径中,所求得的路径必须是简单路径.即在求得的路径上不能有重复的同一块通道. 为了表示迷宫,设置一个数组,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,数组如下

十四周 项目 1 动物这样叫

#include <iostream> #include <string> using namespace std; class Animal { public: virtual void cry() { cout<<"不知哪种动物,让我如何学叫?"<<endl; } }; class Mouse:public Animal { public: Mouse(string nam,char s):name(nam),sex(s) {} vo

第十四周项目一(1)——折腾二维数组

/* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2014年 11 月 30 日 * 版 本 号:v1.0 * * 问题描述: 无 * 输入描述: 输入一些整型数 * 程序输出: 输出二维数组 */ #include <iostream> using namespace std; int main() { int i,j; //创建5行4列的二维整型数组,为数组中的前两

第十四周项目一(2)——折腾二维数组

/* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2014年 11 月 30 日 * 版 本 号:v1.0 * * 问题描述: 无 * 输入描述: 输入一些整型数 * 程序输出: 输出二维数组 */ #include <iostream> using namespace std; int main() { int i,j; //创建5行4列的二维整型数组,为数组中的前两

第十四周项目一(3)——折腾二维数组

/* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2014年 11 月 30 日 * 版 本 号:v1.0 * * 问题描述: 无 * 输入描述: 输入一些整型数 * 程序输出: 输出二维数组 */ #include <iostream> using namespace std; int main() { int i,j; //创建5行4列的二维整型数组,为数组中的前两

第十四周项目一(4)——折腾二维数组

/* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2014年 11 月 30 日 * 版 本 号:v1.0 * * 问题描述: 无 * 输入描述: 输入一些整型数 * 程序输出: 输出二维数组 */ #include <iostream> using namespace std; int main() { int i,j; //创建5行4列的二维整型数组,为数组中的前两

第十四周项目一(5)——折腾二维数组

/* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2014年 12 月 01 日 * 版 本 号:v1.0 * * 问题描述: 无 * 输入描述: 输入一些整型数 * 程序输出: 输出二维数组 */ #include <iostream> using namespace std; int main() { int i,j; //创建5行4列的二维整型数组,为数组中的前两

第十四周项目一(6)——折腾二维数组

/* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2014年 12 月 01 日 * 版 本 号:v1.0 * * 问题描述: 无 * 输入描述: 输入一些整型数 * 程序输出: 输出二维数组 */ #include <iostream> using namespace std; int main() { int i,j; //创建5行4列的二维整型数组,为数组中的前两