#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include <conio.h>
using namespace std;
#define LEN 12
typedef struct
{
int x,y;
}postype;
typedef struct
{
int m,n;
int arr[LEN][LEN];
}mazetype;
typedef struct
{
int ord;
postype seat;
int di;
}selemtype;
#include "sqstack.cpp"
void initmaze(mazetype &maze,int a[][LEN],int row,int col);
bool mazepath(mazetype &maze,postype start,postype end);
void print_mz(mazetype maze,int row,int col);
status pass(mazetype &maze,postype pos);
void footprint(mazetype &maze,postype pos,int curstep);
void markprint(mazetype &maze,postype pos);
int same(postype curpos,postype end);
postype nextpos(postype pos,int dir);
void readcommand(char &cmd);
void initialization();
void interpret(char cmd);
void main()
{
char cmd;
do
{
initialization();
readcommand(cmd);
interpret(cmd);
}while(cmd!='q'&&cmd!='Q');
}
void initialization()
{
cout<<"求解迷宫---c,退出程序---q"<<endl;
}
void readcommand(char &cmd)
{
do
{
cmd=getche();
}while(cmd!='c'&&cmd!='C'&&cmd!='q'&&cmd!='Q');
}
void interpret(char cmd)
{
int rnum,cnum;//rnum表示行数,cnum表示列数
int a2[LEN][LEN];
int i,j;
mazetype ma;
postype from,term;
switch(cmd)
{
case 'c':
case 'C':
FILE *in,*out;
in=fopen("in.data","rb");
out=fopen("out.data","wb");
fscanf(in,"%d",&rnum);
fscanf(in,"%d",&cnum);
for (i=1;i<=rnum;i++)
for(j=1;j<=cnum;j++)
fscanf(in,"%d",&a2[i][j]);
initmaze(ma,a2,rnum,cnum);
cout<<"文件中读取的迷宫数据:"<<endl;
for (i=1;i<=rnum;i++)
{
for(j=1;j<=cnum;j++)
cout<<a2[i][j]<<setw(2);
cout<<endl;
}
cout<<"建立迷宫:"<<endl;
print_mz(ma,rnum,cnum);
/*break;
case 'm':
case 'M':*/
cout<<"请输入迷宫入口和出口坐标位置:"<<endl;
cin>>from.x>>from.y>>term.x>>term.y;
if (mazepath(ma,from,term))
{
cout<<"求得迷宫路径如下:"<<endl;
print_mz(ma,rnum,cnum);
}
else
cout<<"该迷宫没有从给定的入口到出口的路径的信息!"<<endl;
break;
fclose(in);
fclose(out);
/*case 'p':
case 'P':
print_mz(ma,rnum,cnum);*/
}
}
void initmaze(mazetype &maze,int a[][LEN],int row,int col)
{
int i,j;
for(i=1;i<=row+1;i++)
for(j=1;j<=col+1;j++)
maze.arr[i][j]=a[i][j];
for(j=0;j<=col+1;j++)
{
maze.arr[0][j]=1;
maze.arr[row+1][j]=1;
}
for(i=0;i<=row+1;i++)
{
maze.arr[i][0]=1;
maze.arr[i][col+1]=1;
}
}
bool mazepath(mazetype &maze,postype start,postype end)
{
sqstack s;
selemtype e;
postype curpos;
int curstep;
bool found;
initstack(s);
curpos=start;
curstep=1;found=FALSE;
do
{
if(pass(maze,curpos))
{
footprint(maze,curpos,curstep);
e.ord=curstep;
e.seat.x=curpos.x;
e.seat.y=curpos.y;
e.di=1;
push(s,e);
if(same(curpos,end)) found=TRUE;
else
{
curpos=nextpos(curpos,1);
curstep++;
}//else
}//if
else
if(!stackempty(s))
{
pop(s,e);
while(e.di==4&&!stackempty(s))
{
markprint(maze,e.seat);
pop(s,e);
curstep--;
}//while
if(e.di<4)
{
e.di++;
push(s,e);
curpos=nextpos(e.seat,e.di);
}//if
}//if
}while(!stackempty(s)&&!found);
return found;
}//mazepath
void print_mz(mazetype maze,int row,int col)
{
int i,j;
for(i=0;i<=row+1;i++)
{
for(j=0;j<=col+1;j++)
cout<<maze.arr[i][j]<<setw(2);
cout<<endl;
}
}
status pass(mazetype &maze,postype pos)
{
return (maze.arr[pos.x][pos.y]==0);
}
void footprint(mazetype &maze,postype pos,int curstep)
{
maze.arr[pos.x][pos.y]=curstep;
}
void markprint(mazetype &maze,postype pos)
{
maze.arr[pos.x][pos.y]=-1;
}
postype nextpos(postype pos,int dir)
{
postype direct[5]={{0,0},{0,1},{1,0},{0,-1},{-1,0}};
pos.x +=direct[dir].x;
pos.y +=direct[dir].y;
return pos;
}
int same(postype curpos,postype end)
{
if (curpos.x==end.x&&curpos.y==end.y) return OK;
else return 0;
}
sqstack.cpp代码:
#include "predef.h"
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int status;
typedef struct
{
selemtype *base;
selemtype *top;
int stacksize;
}sqstack;
status initstack(sqstack &s);
//status destroystack(sqstack&s);
//status clearstack(sqstack &);
status stackempty(sqstack s);
status push(sqstack &s,selemtype e);
status pop(sqstack &s,selemtype &e);
status initstack(sqstack &s)
{
s.base=(selemtype *)malloc(STACK_INIT_SIZE*sizeof(selemtype));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
status stackempty(sqstack s)
{
return (s.top==s.base);
}
status push(sqstack &s,selemtype e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(selemtype *)realloc(s.base,(s.stacksize +STACKINCREMENT)*sizeof(selemtype));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
status pop(sqstack &s,selemtype &e)
{
if(s.top==s.base) return ERROR;
e=*--s.top;
return OK;
}
测试数据格式in.data:
3 4
0 0 0 1
1 0 0 1
0 1 0 0
分享到:
相关推荐
C++迷宫问题的解决方法,主要使用DFS深度优先搜索算法
迷宫C++代码 迷宫C++代码 迷宫C++代码 迷宫C++代码 迷宫C++代码 迷宫C++代码
在"迷宫实验"的压缩包中,很可能包含了实现上述思路的C++代码,可以用于学习和实践。通过分析和理解这些代码,你可以深入理解迷宫问题的解决方法,以及如何用C++有效地处理实际的编程问题。这不仅是提升编程技巧的好...
在计算机科学领域,迷宫问题是一个经典的问题,它涉及到路径搜索和图遍历算法。本文将深入探讨在C++环境中解决迷宫问题所涉及的知识点,...通过分析源代码,我们可以深入学习C++编程技巧以及如何应用算法解决实际问题。
"数据结构实验迷宫实现(C++代码)"这个标题暗示了我们将深入到数据结构和算法的世界,特别是与图和搜索策略相关的知识。迷宫问题通常涉及在二维网格中找到从起点到终点的有效路径,而C++作为一种强大的编程语言,...
### 数据结构迷宫问题C++源代码解析 #### 核心知识点 1. **栈(Stack)的概念与应用** 2. **迷宫问题求解算法** 3. **C++编程语言基础** 4. **动态内存分配** #### 详细解析 ##### 1. 栈(Stack)的概念与应用 ...
c++代码实现迷宫的算法,利用栈操作
迷宫c++游戏代码资源!
用于数据结构实习,其中用到哦栈操作,采用非递归算法
在本文中,我们将深入探讨如何使用C++编程语言来解决迷宫问题。迷宫问题是一个经典的计算机科学问题,它涉及到路径查找和搜索算法。在这个特定的案例中,迷宫是通过文件存储的,这意味着我们需要读取文件数据并利用...
【小游戏】走迷宫c++/c代码【小游戏】走迷宫c++/c代码【小游戏】走迷宫c++/c代码【小游戏】走迷宫c++/c代码【小游戏】走迷宫c++/c代码【小游戏】走迷宫c++/c代码【小游戏】走迷宫c++/c代码【小游戏】走迷宫c++/c代码
本科生计算机相关专业 人工智能课程 A*算法解决迷宫问题C++代码 详细注释,易懂
C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码
本课程设计的主题是“迷宫问题”,采用C++语言作为实现工具,这对于理解和掌握高级编程技巧以及数据结构的应用至关重要。 C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向...
### 迷宫问题的C++算法实现 #### 知识点概述 本文将详细解析一个典型的迷宫问题的C++实现方法。通过分析给定的代码片段,我们可以了解到该程序如何构建迷宫、如何利用栈数据结构来寻找从起点到终点的路径,以及...
"C++迷宫寻路算法代码分析" 本资源提供了一个使用C++语言编写的迷宫寻路算法的源代码,通过分析该代码,我们可以总结出以下几个知识点: 1. 迷宫寻路算法:该代码实现了一个基本的迷宫寻路算法,即从源点到目标点...
数据结构课程设计之C++编写的迷宫问题路径求解程序,使用的是栈方法,即将路径上每一步存在栈中,迷宫文件格式见程序提示,压缩包内已经给出了三个测试用的迷宫地图可用来测试,支持分步显示查找路径过程功能,当给...
【迷宫游戏C++代码】是一个典型的编程作业项目,源自华南理工大学计算机专业的课程。这个项目主要是用C++语言实现一个迷宫游戏,旨在帮助学生掌握C++编程基础,理解面向对象编程思想,以及在游戏中可能涉及的数据...
在本项目中,"C++迷宫代码"是一个基于C++的编程练习,目标是设计一个迷宫程序,实现寻找迷宫出口的功能。这个练习通常出现在C++的教材中,旨在帮助学生熟悉对象导向编程(OOP)的概念,以及如何处理复杂的数据结构和...
东北大学数据结构实验中迷宫问题的C++语言代码