修改后的迷宫算法(原版为http://blog.csdn.net/sunshinedabby/article/details/6284779)

// maze.cpp : 定义控制台应用程序的入口点。
//
#include<stdafx.h>
#include<iostream>

using namespace std;
struct PosType//迷宫坐标位置类型
{
int x;//行值
int y;//列值
};
#define MAXLENGTH 100 //设迷宫的最大行列为25
typedef int Mazetype[MAXLENGTH][MAXLENGTH];//迷宫数组
//全局变量
Mazetype m;//迷宫数组
int curstep = 1;//当前足迹,初值为1;
//int a[MAXLENGTH];
//int b[MAXLENGTH];
//int c[MAXLENGTH];
struct SElemType//栈的元素类型
{
int ord;//通道块在路径上的”序号“
PosType seat;//通道块在迷宫中的“坐标位置”
int di;//从此通道块走向下一通道块的方向(0~3表示东~北)
};
#define STACK_INIT_SIZE 10//储存空间初始分配量
#define STACKINCREMENT 2//存储空间分配增量
struct SqStack
{
SElemType *base;//在栈构造之前和销毁之后,base的值为null
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
};//顺序栈
bool Pass(PosType b)
{
//当迷宫m的b点的序号为1(可通路径),return true,否则return false
if (m[b.x][b.y] == 1)
{
return true;
}
else
return false;
}
void FootPrint(PosType a)
{
//使迷宫m的a点序号变为足迹(curstep)
m[a.x][a.y] = curstep;
}
PosType NextPos(PosType c, int di)
{
//根据当前位置及移动方向,返回下一位置
PosType direc[4] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; /* {行增量,列增量} */
//移动方向依次为东南西北
c.x += direc[di].x;
c.y += direc[di].y;
return c;
}
void MarkPrint(PosType b)
{
//使迷宫m的b点的序号变为-1(不能通过的路径)
m[b.x][b.y] = -1;
}
bool InitStack(SqStack *S)
{
//构造一个空栈S
(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if (!(*S).base)
{
exit(1);//存储分配失败
}
(*S).top = (*S).base;
(*S).stacksize = STACK_INIT_SIZE;
return true;
}
bool Push(SqStack *S, SElemType e)
{
//插入元素e为新的栈顶元素
if ((*S).top - (*S).base >= (*S).stacksize)//栈满,追加存储空间
{
(*S).base = (SElemType *)realloc((*S).base, ((*S).stacksize + STACKINCREMENT)*sizeof(SElemType));
if (!(*S).base)
{
exit(1);
}
(*S).top = (*S).base + (*S).stacksize;
(*S).stacksize += STACKINCREMENT;
}
*((*S).top)++ = e; // 指针加1,指向新元素e
return true;
}
bool StackEmpty(SqStack S)
{
if (S.top == S.base)
return true;
else
return false;
}
bool Pop(SqStack *S, SElemType *e)
{
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回Error
if ((*S).top == (*S).base)
return false;
*e = *--(*S).top;
return true;
}
bool MazePath(PosType start, PosType end) /* 算法3.3 */
{ /* 若迷宫maze中存在从入口start到出口end的通道,则求得一条 */
/* 存放在栈中(从栈底到栈顶),并返回TRUE;否则返回FALSE */
SqStack S;
PosType curpos;
SElemType e;
InitStack(&S);
curpos = start;
do
{
if (Pass(curpos))
{ /* 当前位置可以通过,即是未曾走到过的通道块 */
FootPrint(curpos); /* 留下足迹 */
e.ord = curstep;
/*a[curstep] = e.seat.x = curpos.x;
b[curstep] = e.seat.y = curpos.y;
c[curstep] = e.di = 0;*/
e.seat.x = curpos.x;
e.seat.y = curpos.y;
e.di = 0;
Push(&S, e); /* 入栈当前位置及状态 */
curstep++; /* 足迹加1 */
if (curpos.x == end.x&&curpos.y == end.y) /* 到达终点(出口) */
return true;
curpos = NextPos(curpos, e.di);
}
else
{ /* 当前位置不能通过 */
if (!StackEmpty(S))
{
//Pop(&S, &e); /* 退栈到前一位置 */
//curstep--;
if ((e.di == 3) && (!StackEmpty(S))) /* 前一位置处于最后一个方向(北) */
{
MarkPrint(e.seat); /* 留下不能通过的标记(-1) */
Pop(&S, &e); /* 退回一步 */
curpos.x = e.seat.x;
curpos.y = e.seat.y;
curstep--;
}
if (e.di < 3) /* 没到最后一个方向(北) */
{
e.di++; /* 换下一个方向探索 */
Push(&S, e);
/*    a[curstep] = e.seat.x = curpos.x;
b[curstep] = e.seat.y = curpos.y;
c[curstep] = e.di;*/
e.seat.x = curpos.x;
e.seat.y = curpos.y;
e.di;
curstep++;
curpos = NextPos(e.seat, e.di); /* 设定当前位置是该新方向上的相邻块 */
}
}
}
} while (!StackEmpty(S));
return false;
}

void Print(int x, int y)
{ /* 输出迷宫的解 */
int i, j;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
cout << " " << m[i][j];
cout << endl;
}
}
void test()
{
PosType begin, end;
int i, j, x, y, x1, y1, xxx;
cout << "请输入迷宫的行数,列数(包括外墙):";
cin >> x >> y;
for (i = 0; i < x; i++) /* 定义周边值为0(同墙) */
{
m[0][i] = 0; /* 行周边 */
m[x - 1][i] = 0;
}
for (j = 1; j < y - 1; j++)
{
m[j][0] = 0; /* 列周边 */
m[j][y - 1] = 0;
}
for (i = 1; i < x - 1; i++)
for (j = 1; j < y - 1; j++)
m[i][j] = 1; /* 定义通道初值为1 */
cout << "迷宫结构如下:" << endl;
Print(x, y);
cout << "请输入迷宫内墙单元数:";
cin >> j;
cout << "请依次输入迷宫内墙每个单元的行数,列数:" << endl;
for (i = 1; i <= j; i++)
{
cin >> x1 >> y1;
m[x1][y1] = 0; /* 定义墙的值为0 */
}
cout << "迷宫结构如下:" << endl;
Print(x, y);
cout << "请输入起点的行数,列数:";
cin >> begin.x >> begin.y;
cout << "请输入终点的行数,列数:";
cin >> end.x >> end.y;
if (MazePath(begin, end)) /* 求得一条通路 */
{
cout << "此迷宫从入口到出口的一条路径如下:" << endl;
Print(x, y); /* 输出此通路 */

/*for (i = 1; i<curstep; i++)
cout << a[i] << " " << b[i] << " " << c[i] << endl;*/
}
else
{
cout << "此迷宫没有从入口到出口的路径" << endl;
}

cin >> xxx;
}
void main()
{
test();
}
时间: 2024-08-03 19:25:03

修改后的迷宫算法(原版为http://blog.csdn.net/sunshinedabby/article/details/6284779)的相关文章

解析Javascript事件冒泡机制(转) 本文转自:http://blog.csdn.net/luanlouis/article/details/23927347

本文转自:http://blog.csdn.net/luanlouis/article/details/23927347 1. 事件 在浏览器客户端应用平台,基本生都是以事件驱动的,即某个事件发生,然后做出相应的动作. 浏览器的事件表示的是某些事情发生的信号.事件的阐述不是本文的重点,尚未了解的朋友,可以访问W3school教程 进行了解,这将有助于更好地理解以下的内容 . 2. 冒泡机制 什么是冒泡呢? 下面这个图片大家应该心领神会吧,气泡从水底开始往上升,由深到浅,升到最上面.在上升的过程中

Windows下QT4.8.4编译环境的搭建(转载http://blog.csdn.net/bestgonghuibin/article/details/38933141)

开始使用QT了,所以第一步就是把环境搭起来,这里小记一下,以免以后忘记. 1. 下载安装文件 要使用QT功能,那么必须要下载QT的源码,还必须要一个是用QT的编译环境,可以是VS2010,也可以是专用于QT编程的QT Creator.本人选择QT Creator,所以也必须要下载QT Creator. 根据网上大部分教程及自己买的书籍获取的信息,在选择版本的时候,QT 源码选择4.8.4,而QT Creator选择2.8.0(QT5.0以后许多原有的文件路径改变). 选择好版本之后,可以上QT的

Javascript 设计模式 单例 http://blog.csdn.net/lmj623565791/article/details/30490955/

转载请标明出处:http://blog.csdn.NET/lmj623565791/article/details/30490955 一直很喜欢Js,,,今天写一个Js的单例模式实现以及用法. 1.单例模式的写法 单例模式写法相当简单: [javascript] view plain copy var singleTon = { m1: "memeber first ", m2: "memeber second ", f1: function () { consol

系统权限管理设计 (转:http://blog.csdn.net/chexlong/article/details/37697555)

权限设计(转:http://blog.csdn.net/chexlong/article/details/37697555) 1. 前言: 权限管理往往是一个极其复杂的问题,但也可简单表述为这样的逻辑表达式:判断"Who对What(Which)进行How的操作"的逻辑表达式是否为真.针对不同的应用,需要根据项目的实际情况和具体架构,在维护性.灵活性.完整性等N多个方案之间比较权衡,选择符合的方案. 2. 目标: 直观,因为系统最终会由最终用户来维护,权限分配的直观和容易理解,显得比较重

Android音频系统之音频框架(转http://blog.csdn.net/uiop78uiop78/article/details/8796492)

1.1 音频框架 转载请注明,From LXS, http://blog.csdn.net/uiop78uiop78/article/details/8796492 Android的音频系统在很长一段时间内都是外界诟病的焦点.的确,早期的Android系统在音频处理上相比于IOS有一定的差距,这也是很多专业的 音乐播放软件开发商没有推出Android平台产品的一个重要原因.但这并不代表它的音频框架一无是处,相反,基于Linux系统的Android平台有 很多值得我们学习的地方. 1.1.1 Li

http://blog.csdn.net/LANGXINLEN/article/details/50421988

GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时候,无意中发现了 @Trinea在GitHub上的一个项目 Android开源项目分类汇总, 由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫的界面特效设计.个性化控件.工具库.优秀的Android 开源项目.开发测试工具.优秀个人和团体等.可以这样说,每一位Andorid开发人员都能从中找到一个或多个适用自己项目的解决方案,消化吸收并加以利 用,可以为自己的APP增色不少.文章最后还

转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101

Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要讲解了异常.多线程.容器和I/O的相关面试题.首先,异常机制提供了一种在不打乱原有业务逻辑的前提下,把程序在运行时可能出现的状况处理掉的优雅的解决方案,同时也是面向对象的解决方案.而Java的线程模型是建立在共享的.默认的可见的可变状态以及抢占式线程调度两个概念之上的.Java内置了对多线程编程的支

Cassandra研究报告-http://blog.csdn.net/zyz511919766/article/details/38683219/

转自http://blog.csdn.net/zyz511919766/article/details/38683219/ 1基本安装 1.1在基于RHEL的系统中安装Cassandra 1.1.1必要条件 Ø  YUM包管理器 Ø  Root或sudo权限 Ø  JRE6或者JRE7 Ø  JNA(Java native Access)(生产环境需要) 1.1.2步骤 Ø  安装配置JRE(略) Ø  添加软件包仓库到YUM的软件库 将以下内容添加进/etc/yum.repos.d/datas

Win32消息循环机制等【转载】http://blog.csdn.net/u013777351/article/details/49522219

Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法.顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序.虽然在顺序的过程驱动的程序中也有很多处理异常的方法,但这样的异常处理也仍然是顺序的,过程驱动的结构. 而Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程