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();
}

 

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

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

C++ queue应用之电路布线(迷宫的最短路径)

假如我们给定一个如下所示的迷宫,蓝色表示边界或不可通过的区域(用1表示),白色表示可以通过的区域(用0表示),绿色表示起始点,红色表示到达的终点。这样可以用一个数组表示这个Maze。 我们要做的...
  • Boyhou
  • Boyhou
  • 2013年04月18日 20:28
  • 1592

数据结构_队列_迷宫的最短路径

问题来源《数据结构》(c语言版)主编 秦锋 P86 求迷宫的最短路径:现在设计一个算法找一条从迷宫入口到出口的最短路径。 //这个算法是队列,递归综合考察 #include #include #def...

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

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

数据结构与算法——无权最短路径算法的C++实现

数据结构与算法——无权最短路径算法的C++实现(用两个算法来实现,图的邻接表表示法来实现的图类)...

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

#include #include #include #define Maxsize 50 int mg[10][10]; void shengcheng() { for(int i=0; i

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

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

(hdu step 4.2.3)Knight Moves(求从起点是否能够到达终点的最小步数)

题目:Knight MovesTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++利用队列(Queue)求解迷宫(Maze)中指定起点和终点间是否有最短路径,如果有的话输出所需步数,如果没有输出
举报原因:
原因补充:

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