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

#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(){
}
bool isEmpty(){
return false;
}
void Push(Node *obj){
if(isEmpty()){
return;
}
tail->next=obj;
tail=obj;
}
Node Pop(){
assert(!isEmpty());
Node temp;
return temp;
}
return temp;
}
~Queue(){}
public:
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
• 2012年05月20日 14:04
• 1011

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

• cainv89
• 2016年06月05日 12:09
• 2347

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

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

## 迷宫的最短路径（BFS的简单应用）

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

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

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

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

• kangquan2008
• 2011年10月07日 14:54
• 4022

## 最少步数(迷宫问题类型）

• 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
• 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
• 2016年04月02日 17:03
• 412

## 最短路径：HDU2006-一个人的旅行（多个起点，多个终点）

• yopilipala
• 2017年06月29日 17:35
• 399

举报原因： 您举报文章：C++利用队列（Queue）求解迷宫（Maze）中指定起点和终点间是否有最短路径，如果有的话输出所需步数，如果没有输出 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)