C++利用队列(Queue)求解迷宫(Maze)中指定起点和终点间是否有最短路径,如果有的话输出所需步数,如果没有输出

原创 2012年03月23日 23:12:10

#include <iostream.h>
#include <assert.h>
class Maze{
public:
 class Point{
 public:
  Point():i(0),j(0){}
  Point(int x,int y):i(x),j(y){}
  Point(Point &x){
   i=x.i;
   j=x.j;
  }
  ~Point(){}
 public:
  void Set(int x,int y){
   i=x;
   j=y;
  }
  Point operator+(Point &p){
   return Point(i+p.i,j+p.j);
  }
  Point &operator=(Point &p){
   i=p.i;
   j=p.j;
   return *this;
  }
  bool operator==(Point &p){
   return i==p.i&&j==p.j;
  }
  bool operator!=(Point &p){
   return i!=p.i||j!=p.j;
  }
 public:
  int i;
  int j;
 };
 public:
  class Node{
  public:
   Node(){
   next=NULL;
   step=0;
   }
   Node(Point &p):pos(p){
   next=NULL;
   step=0;
   }
   Node(Point &p,int x):pos(p),step(x){}
   Node &operator=(Node &obj){
    pos=obj.pos;
    step=obj.step;
    return *this;
   }
   ~Node(){}
  public:
   Point pos;
   int step;
   Node *next;
  };
  public:
   class Queue{
   public:
    Queue(){
    head=tail=NULL;
    }
    bool isEmpty(){
     if(head==NULL&&tail==NULL)return true;
     return false;
    }
    void Push(Node *obj){
     if(isEmpty()){
      head=tail=obj;
      return;
     }
     tail->next=obj;
     tail=obj;
    }
    Node Pop(){
     assert(!isEmpty());
     Node temp;
     temp=*head;
     if(head==tail&&tail!=NULL){
      head=tail=NULL;
      return temp;
     }
     head=head->next;
     return temp;
    }
    ~Queue(){}
   public:
    Node *head;
    Node *tail;
   };
   public:
    Maze(){
    direction[0]=Point(1,0);
    direction[1]=Point(0,1);
    direction[2]=Point(-1,0);
    direction[3]=Point(0,-1);
    }
    ~Maze(){}
    void Init();
    void FindPath();
   public:
    Queue path;
    Point start;
    Point end;
    Point present;
    Point direction[4];
    static int matrix[10][10];
    int row,col;
   };
int Maze::matrix[10][10]={0,0,0,0,0,0,0,0,0,0,
      0,1,1,0,1,1,1,0,1,0,
      0,1,1,0,1,1,1,0,1,0,
      0,1,1,1,1,1,1,1,1,0,
      0,1,0,0,0,1,1,1,1,0,
      0,1,1,1,0,1,1,1,1,0,
      0,1,0,1,1,1,0,1,1,0,
      0,1,0,0,0,1,0,0,1,0,
      0,0,0,0,0,0,0,0,0,0};//1表示可通过,0表示不能通过
void Maze::Init(){
 cout<<"Input the rows:"<<endl;
 cin>>row;
 cout<<"Input the cols:"<<endl;
 cin>>col;
 cout<<"Input the starting point:"<<endl;
 cin>>start.i>>start.j;
 cout<<"Input the ending point:"<<endl;
 cin>>end.i>>end.j;
 //present.i=start.i;
 //present.j=start.j;
 present=start;
 //path.Push(present);
}
void Maze::FindPath(){
 path.Push(new Maze::Node(present));
 matrix[present.i][present.j]=2;//2表示该节点已经被扫描
 Maze::Node temp;
 while(!path.isEmpty()){
  temp=path.Pop();
  //cout<<temp.pos.i<<' '<<temp.pos.j<<endl;
  for(int i=0;i<4;++i){
   present=temp.pos+direction[i];
   if(matrix[present.i][present.j]==1&&present!=end){
    path.Push(new Maze::Node(present,temp.step+1));
    matrix[present.i][present.j]=2;
    continue;
   }
   if(present==end){
    cout<<"The path takes "<<temp.step+1<<" steps."<<endl;
    return;
   }
  }
 }
 cout<<"There is no path."<<endl;
}
void main(){
 Maze obj;
 obj.Init();
 obj.FindPath();
}

 

C++数据结构之漫步迷宫

《数据结构》课程设计任务书   一 。课程设计题目:漫步迷宫 二 。问题描述:      用m行n列的m*n个正方格表示一个迷宫,其中划有斜线的方格表示不可通行,未划有斜线的方格表示可以通行。...
  • hu2008yinxiang
  • hu2008yinxiang
  • 2012年05月20日 14:04
  • 1011

迷宫最短路径问题(ShortestPath)的求解——利用链式队列

迷宫最短路径问题(ShortestPath)的求解——利用链式队列 注:借助于栈求解迷宫问题时,并不能保证找到一条从迷宫入口到迷宫出口的最短路径。而借助于队列,可以找到从迷宫入口到迷宫出口的最短路径...
  • cainv89
  • cainv89
  • 2016年06月05日 12:09
  • 2347

迷宫最短路径算法(使用队列)

    (上接迷宫递归算法)    顺便也把图里求迷宫最短路径算法贴出来,主要思想是利用队列,采用广度优先搜索法,当第一次出现目的点时,中断搜索,并输出路径。程序还是主要使用的C语言,对于队列操作我又...
  • littlehedgehog
  • littlehedgehog
  • 2007年08月25日 13:17
  • 8413

迷宫的最短路径(BFS的简单应用)

竞赛
  • u013749862
  • u013749862
  • 2014年08月12日 13:58
  • 1056

POJ 3984 迷宫问题(BFS:迷宫最短路径且输出路径)

POJ 3984 迷宫问题(BFS:迷宫最短路径且输出路径) http://poj.org/problem?id=3984 分析: 典型的BFS应用,要你求从左上角到右下角的最短路径,且保证有唯一解,...
  • u013480600
  • u013480600
  • 2014年05月10日 15:51
  • 3149

输出迷宫的所有路径和最短路径

编写这个代码主要是锻炼一下回溯和分支界限法的,分别通过深搜和广搜遍历解空间树可以解决 输出迷宫的所有路径和输出所有迷宫最短路径的两个问题,其中要注意的包括: 1,剪枝:包括界限和约束,在这个问...
  • kangquan2008
  • kangquan2008
  • 2011年10月07日 14:54
  • 4022

最少步数(迷宫问题类型)

最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列:  1,1,1,1,1,1,1,1,1  1,0,0,1,0,0...
  • qaz135135135
  • qaz135135135
  • 2016年07月21日 22:10
  • 900

队列实现求迷宫最短路径(包含每一步的尝试状态,迷宫随机生成)

#include #include #include #define Maxsize 50 int mg[10][10]; void shengcheng() { for(int i=0; i
  • lidekun9132
  • lidekun9132
  • 2016年10月13日 21:12
  • 1004

DFS求起点到终点最短路径,手动输入地图,5行4列,地图如下,起点(1,1)终点(4,3) 1是障碍 0是通路

//DFS求起点到终点最短路径,手动输入地图,5行4列,地图如下,起点(1,1)终点(4,3) 1是障碍 0是通路 //5 4 //0 0 1 0 //0 0 0 0 //0 0 1 0 //0 1 ...
  • guokaigdg
  • guokaigdg
  • 2016年04月02日 17:03
  • 412

最短路径:HDU2006-一个人的旅行(多个起点,多个终点)

解题心得: 1、之前做的最短路径使用Dijkstra算法一直都是算的一个起点,所以在一开始有一点懵逼,其实在使用Dijkstra算法之接将所有的起点全部初始化为0就可以了,它会自动寻找多个起点到终点的...
  • yopilipala
  • yopilipala
  • 2017年06月29日 17:35
  • 399
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++利用队列(Queue)求解迷宫(Maze)中指定起点和终点间是否有最短路径,如果有的话输出所需步数,如果没有输出
举报原因:
原因补充:

(最多只允许输入30个字)