解迷宫的C++的未完善编程代码........请大神们帮忙改善下.........
这......................................................................
我也是醉了
看不太懂,大神们求解.............................................
#include<iostream>
#include<stack>
#include<stdio.h>
#include<time.h>
#include<string>
using namespace std;
typedef struct
{
int x,y;
}item; typedef struct
{
int x,y,d;
}Datetype;
typedef stack<Datetype> stack_int;
void path (int **maze,int,int,int,int);
void printpath();
#define NUM 100 //队列大小;
typedef struct{
int x,y; //所到点的坐标;
int pre; //前驱点的下标;
}SqType; //队列;
int front,rear; //队首指针与队尾指针;
void printpath(SqType sq[],int){//打印路径
int i;
i=rear;
do{
cout<<"("<<sq[i].x<<","<<sq[i].y<<")<--";
i=sq[i].pre; //回溯;
}while(i!=-);
}
void restore(int **maze,int m,int n){//恢复迷宫
for(int i=;i<=m;i++){
for(int j=;j<=n;j++){
if(maze[i][j]==-);
}
}
}
int path1(int **maze,int m,int n,int c,int d,int x1,int y1)//最短路径
{ //m,n为迷宫的长和宽,c,d为迷宫入口坐标,x1,y1为迷宫出口坐标;maze为迷宫;
item move[]={{,},{,},{,},{,-},{,-},{-,-},{-,},{-,}}; //坐标增量数组;
SqType sq[NUM];
int x,y,i,j,v;
front=rear=;
sq[].x=c;
sq[].y=d;
sq[].pre=-;
if(maze[c][d]==)
maze[c][d]=-;//入口点入队;
else goto G;
while(front<=rear){ //队列不为空
x=sq[front].x;
y=sq[front].y;
for(v=;v<;v++){
i=x+move[v].x;
j=y+move[v].y;
if(maze[i][j]==){
rear++;
sq[rear].x=i;
sq[rear].y=j;
sq[rear].pre=front;
maze[i][j]=-; //访问过的坐标点,入队;
}
if(i==x1&&j==y1){
cout<<"最短路径为:"<<endl;
printpath(sq,rear); //输出路径;
restore(maze,m,n); //恢复迷宫;
return ;
}
} //for v;
front++; //当前点搜索完,取下一个点搜索
} //while
G:cout<<"无路径。"<<endl;
return ;
}
void path(int **maze,int a,int b,int m,int n)
{
item move[]={{,},{,},{,},{,-},{,-},{-,-},{-,},{-,}};
stack_int st;
Datetype temp;
int x,y,d,i,j;
if(maze[a][b]==){cout<<"进口输入有误。";return;}
temp.x=a;temp.y=b;temp.d=-; //初始化入口点坐标及方向;
st.push(temp);
while(!st.empty())
{
temp=st.top();
st.pop();
x=temp.x;y=temp.y;d=temp.d+;
while(d<)
{
i=x+move[d].x;j=y+move[d].y;
if(maze[i][j]==) //该点可到达;
{
temp.x=x;temp.y=y;temp.d=d; //坐标及方向;
st.push(temp); //坐标及方向入栈;
x=i;y=j;
maze[x][y]=-;//到达新点;
if(x==m && y==n)
{
cout<<" 迷宫路径为:"<<endl;
cout<<"("<<m<<","<<n<<")<---";
Datetype t;
while(!st.empty())
{
t=st.top();
cout<<"("<<t.x<<","<<t.y<<")<---";
st.pop();
} //输出路径;
cout<<endl;
return ; //到达出口;
}
else d=; //重新初始化方向;
}
else d++; //改变方向;
}
}
cout<<"对不起,无法找到出口.";
return; //迷宫无路;
} void printpath()
{
int m,n,i,j,l,c,d;
string s;
cout<<"********************************************************************************\n"<<endl;
cout<<" 欢迎进入迷宫求解系统\n"<<endl;
cout<<"********************************************************************************\n"<<endl;
cout<<" 请输入迷宫的行数:"<<endl;
cin>>m;
cout<<" 请输入迷宫的列数:"<<endl;
cin>>n;
int **maze=new int*[m+];
for(i=;i<=m+;i++)
maze[i]=new int[n+];//申请迷宫的空间;
for(i=;i<=m+;i++)
maze[i][]=;
for(i=;i<=n+;i++)
maze[][i]=;
for(i=;i<=m+;i++)
maze[i][n+]=;
for(i=;i<=n+;i++)
maze[m+][i]=; //建立迷宫周围的墙;
cout<<"********************************************************************************\n"<<endl;
cout<<" ☆ 自动生成迷宫 请按:1\n ☆ 手动生成迷宫 请按:2\n"<<endl;
cout<<"********************************************************************************\n"<<endl;
cin>>s;
if(s=="")
{
srand(time()); //系统时间随机函数;
for(i=;i<=m;i++)
for(j=;j<=n;j++)
maze[i][j]=rand()%; //随机赋值
maze[][]=; //(1,1)点为可通过点;
maze[m][n]=; //(m,n)点为可通过点;
}
else
{
cout<<"请输入迷宫:"<<m<<"行"<<n<<"列"<<", 输入必须为'0' 或 '1';"<<endl;
for(i=;i<=m;i++) //输入第i行迷宫的构造;
for(j=;j<=n;j++) //输入第j列迷宫的结构;
{
cin>>maze[i][j];
A:if(maze[i][j]!= && maze[i][j]!=)
{
cout<<"请再次输入:";
cin>>maze[i][j];goto A; //判错;
}
}
}
cout<<"迷宫如下:"<<endl; //显示用户输入的迷宫;
for(i=;i<=m+;i++)
{
for(j=;j<=n+;j++)
{
if (*(maze[i]+j)==||*(maze[i]+j)==)
{
cout<<" ";
}
else if(*(maze[i]+j)==)
{
cout<<"□";
}
else if(*(maze[i]+j)==)
{
cout<<"※";
}
else if(*(maze[i]+j)==)
{
cout<<"■";
}
else if(*(maze[i]+j)==)
{
cout<<"☆";
}
else if(*(maze[i]+j)==) //找到出口标识
{
cout<<"★";
} else
{
cout<<"出错!";
} }
cout<<"\n";
}
H:cout<<"请输入迷宫入口(a,b),出口(c,d):";
cin>>i>>j>>c>>d;
path(maze,i,j,c,d); //调用路径函数,输出路径;
cout<<endl; //格式设置;
restore(maze,m,n); //恢复迷宫;
path1(maze,m,n,i,j,c,d); //输出最短路径;
cout<<endl; //格式设置;
cout<<"********************************************************************************\n";
cout<<" 1、寻找其他入口与出口;\n 2、退出此迷宫;\n";
cout<<"********************************************************************************\n"<<endl;
cin>>l;
if(l==){
restore(maze,m,n); //恢复迷宫;
goto H;
}
else return; //跳出此函数;
}
int main()
{
string s="Y";
do
{
cout<<"--------------------------欢迎到达迷宫界面--------------------------\n";
printpath();
cout<<endl;
cout<<"\n 是否继续?'Y' 或'N'(输入其他操作按'N')"<<endl;
cin>>s;
}while (s=="Y"||s=="y");
system("pause");
}
这...........迷宫代码求改善.............
解迷宫的C++的未完善编程代码........请大神们帮忙改善下.........的更多相关文章
- python之选课系统详解[功能未完善]
作业需求 思路:1.先写出大体的类,比如学校类,学生类,课程类-- 2.写出类里面大概的方法,比如学校类里面有创建讲师.创建班级-- 3.根据下面写出大致的代码,并实现其功能 遇到的困 ...
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
- Java IO编程全解(三)——伪异步IO编程
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7723174.html 前面讲到:Java IO编程全解(二)--传统的BIO编程 为了解决同步阻塞I/O面临 ...
- 剑指Offer——回溯算法解迷宫问题(java版)
剑指Offer--回溯算法解迷宫问题(java版) 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路. 下面我们来详细讲一 ...
- Java IO编程全解(二)——传统的BIO编程
前面讲到:Java IO编程全解(一)——Java的I/O演进之路 网络编程的基本模型是Client/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口 ...
- A* search算法解迷宫
这是一个使用A* search算法解迷宫的问题,细节请看:http://www.laurentluce.com/posts/solving-mazes-using-python-simple-recu ...
- “RazorEngine.Templating.TemplateCompilationException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理
错误信息: "RazorEngine.Templating.TemplateCompilationException"类型的异常在 RazorEngine.NET4.0.dll 中 ...
- System.Windows.Forms.AxHost.InvalidActiveXStateException”类型的异常在 ESRI.ArcGIS.AxControls.dll 中发生,但未在用户代码中进行处理
private void CopyAndOverwriteMap() { //IObjectCopy接口变量申明 IObjectCopy objectCopy = new ObjectCopyClas ...
- “System.Exception”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理
“System.Exception”类型的异常在 NHibernate.dll 中发生,但未在用户代码中进行处理 其他信息: OCIEnvCreate 失败,返回代码为 -,但错误消息文本不可用. 如 ...
随机推荐
- Renci.SshNet在Linux运维的应用
SSH.NET是一个.net的SSH应用库,支持并发.该库最新的代码可以从github上下载下来,比Sharp.SSH更新的频繁.它可以模拟ssh登陆,类似xshell.putty等工具.不过有更多的 ...
- matlab直方图均衡,使用向量优化
matlab自带有histeq函数对图像进行直方图均衡 自己写了一个,改成向量化形式,效率提高了一点,但是比自带的还是差很多,差不多9倍 function D = my_histeq(I) [m,n] ...
- oracle客户端安装配置 tnsnames.ora文件
Oracle客户端tnsnames.ora连接配置 Oracle90的在C:\Oracle\ora90\network\ADMIN下面 Oracel10g的在D:\oracle\product\10. ...
- (转)SVN服务器搭建和使用(三)
接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态, ...
- Linux中可用于管道操作的命令总结
在Linux中药进行稍复杂的操作,通常需要借助管道命令"|"多个命令的组合,形式如下: command 1 | command 2 | command 3 -- 在linux中 ...
- py2exe使用方法
一.简介 py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序. py2e ...
- paper 120:计算距离矩阵的函数的pdist和pdist2函数
matlab中自带的计算距离矩阵的函数有两个pdist和pdist2.前者计算一个向量自身的距离矩阵,后者计算两个向量之间的距离矩阵.基本调用形式如下: D = pdist(X) D = pdist2 ...
- 一个java的Profile工具
场景:我们在系统运行中,需要监控某个代码段的运行时间,我们完全可以使用currentTimeMillis来做,但是做起来比较麻烦,尤其是需要阶段监控的时候,那么这个工具就出现啦~~~ 先说下想要实现的 ...
- 一次爬虫实践学习(C#)
我们经常浏览网页,有时候看到一些精美的图片,想下载下来保存,但是太多,如果一张一张的下载,那太费时了:如果你喜欢看书,看小说,那么浏览小说网站是常有的事,但是有时候我们不能联网,比如农村老家,如果还想 ...
- mybatis,sql 批量更新
<update id="update81OrderStatus" parameterType="java.util.Map"> update ...