菜鸟的高手情结——数据结构之走迷宫.数据结构习题哦

2023-12-04 22:38

本文主要是介绍菜鸟的高手情结——数据结构之走迷宫.数据结构习题哦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这几天,我睡不着,课也不想上。就是因为数据结构的作业,一道迷宫问题。只要是上过数据结构的一订会遇到这道题。我原以为这么经典的题目网上一定会有完美的答案。搜了好久也没见完美。有是有人谈,但都只给一大段代码,看不懂啊!为了证明我不是弱智我翘了选修课

终于搞定它。水平有限,这只是初步代码。废话少说直接代码:

 

//main.cpp

#include<iostream>
#include<string>
#include "stack.h"
#include "maze.h"

bool MatchPath(maze ma,stack &pathstack,point in,point out);

int main()
{
 //输入地图名称,初始化
 std::cout<<"请输入地图名称,确保地图文件位置存放正确\n";
 char mapname[25];
 std::cin>>mapname;
 maze ma;
 if(!ma.InitMaze(mapname))
 {std::cout<<"地图的名称有问题或地图文件内里的数据有问题,请检查\n";
 return 0;}
 //入口坐标
 ma.PrintMaze();
 std::cout<<"请输入入口坐标\n";
 int ix,iy;
 std::cin>>ix>>iy;
 std::cout<<"请输入出口坐标\n";
 int ox,oy;
 std::cin>>ox>>oy;
 //检查坐标输入是否合理
 if(ix<0||ix>=ma.i||ox<0||ox>=ma.j)
 {std::cout<<"坐标输入错误!";return 0;}
 
 //查找路径
 std::cout<<"路径查找中...\n";
 
 point in,out;
 in.x=ix;in.y=iy;
 out.x=ox;out.y=oy;
 stack path;
 //匹配的关键算法
 stack path2;
 if(MatchPath(ma,path,in,out))
 {
 std::cout<<"结果如下:\n";
 //因为栈中保存的路径是倒叙的,现在将这个栈中的元素压入另一个栈,就是正序了,
 //在此过程中我们将地图中国的找到通路路径标记为*,方便输出时查看
 
 while(!path.Isempty()){
  point tem;
  path.pop_back(tem);
  ma.MarkPath(tem.x,tem.y,'*');
  path2.push_back(tem);
 }
//输出地图,路径已用*表示
 ma.PrintMaze();
 }
 else std::cout<<"该迷宫无出路!\n";
//输出栈中的路径
 path2.traversing();
 return 0;

}
bool MatchPath(maze ma,stack &path,point start,point out)
{

 point p=start;
 path.push_back(p);
 ma.MarkPath(p.x,p.y,'@');             //走过的路一@标示
 int j=ma.j;
 while(p.x!=out.x||p.y!=out.y){
  if(ma.point[(p.x)*j+p.y]=='@')
    ma.MarkPath(p.x,p.y,'#');
  else ma.MarkPath(p.x,p.y,'@');
 // char c=getchar();

 // if(c=='p')ma.PrintMaze();
  int dir=4;
  if(ma.point[(p.x+1)*j+p.y]=='#')dir-=1;
  if(ma.point[(p.x)*j+p.y+1]=='#')dir-=1;
  if(ma.point[(p.x-1)*j+p.y]=='#')dir-=1;
  if(ma.point[(p.x)*j+p.y-1]=='#')dir-=1;
     if(1==dir)
  {
   ma.MarkPath(p.x,p.y,'#');
   point tem;
   path.pop_back(tem);
   if(path.Isempty())return 0;//栈中已无元素,已无退路,失败
   p.x=path.top->num.x;
   p.y=path.top->num.y;
   ma.MarkPath(p.x,p.y,'#');
   continue;
  }
  if(0==dir)return 0;            //失败了,无路可走
  if(ma.point[(p.x+1)*j+p.y]!='#')   //向下走
  {
   p.x+=1;
   path.push_back(p);
  }
  else if(ma.point[(p.x)*j+p.y+1]!='#')        //向右走
  {
   p.y+=1;
   path.push_back(p);
     }                

  else if(ma.point[(p.x-1)*j+p.y]!='#')        //向上走
  {
   p.x-=1;
   path.push_back(p);
  }                
  else if(ma.point[(p.x)*j+p.y-1]!='#')         //向左走
  {
   p.y-=1;
   path.push_back(p);
  }               
  else;
 }
 return true;
}

//maze.h

#include<fstream.h>
class maze{
public:
 char *point;
 int i,j;
 bool InitMaze(char mapname[]);//初始化
 void MarkPath(int x,int y,char c);                   //更改迷宫状态
 void PrintMaze();//打印迷宫

};
bool maze::InitMaze(char mapname[])//接受一个地图文件
{
 int r,w;
 ifstream fileInput(mapname);
 if(fileInput.is_open()){
  fileInput>>r>>w;
  i=r+2;j=w+2;
  point=new char[i*j];
  char *p=point;

  for(int k=0,num;k<i*j;k++)
  {
   fileInput>>num;
   if(num==0)*p=' ';
   else if(num==1)*p='#';
   else return false;
   p++;
  }
  fileInput.close();
 }
 else return false;
 return true;
}
void maze::MarkPath(int x,int y,char c)
{
 point[x*j+y]=c;
}
void maze::PrintMaze()
{
 for(int x=0;x<i;x++)
 {
  for(int y=0;y<j;y++)
   std::cout<<point[x*j+y]<<" ";
  std::cout<<"\n";
 }
}
//stack.h

typedef struct{
 int x;
 int y;
}point;
typedef struct Node{
 point num;
 struct Node *pNext;
}Node;
class stack{
public:
 Node node;
 Node*top;
 stack();
 void push_back(point a);            //入栈
 void pop_back(point &e);            //出栈
 bool Isempty();                     //判断是否为空
 void traversing();                  //遍历
};
stack::stack()
{
 top=NULL;
}
void stack::push_back(point a)
{
 Node*p;
 p=new Node;
 p->num.x=a.x;
 p->num.y=a.y;
 p->pNext=top;
 top=p;
}
void stack::pop_back(point &e)
{
 Node*p=top;
 e.x=top->num.x;
 e.y=top->num.y;
 top=top->pNext;
 delete p;
}
bool stack::Isempty()
{
 return top==NULL;
}
void stack::traversing()
{
 Node*p=top;
 while(p){
  std::cout<<"("<<p->num.x<<", "<<p->num.y<<") \n";
  p=p->pNext;
 }
}

截图

 

图片

 

 

 

图片

 

 

这篇关于菜鸟的高手情结——数据结构之走迷宫.数据结构习题哦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/455161

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变的有序集合,可以存放任意类型的数据。列表中的元素可以通过索

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

第六章习题11.输出以下图形

🌏个人博客:尹蓝锐的博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏支持一下笔者吧~ 1、题目要求: 输出以下图形