前一阶段数据结构让我们通过01迷宫充分理解队列。
01迷宫:以数组表示迷宫,0表示有路,1表示墙体,无法通过。现写一程序,要求可以输入起点和终点,输出由起点到终点的路线。如果没有线路,则输出“没有路线”
我写得代码如下:
#include <iostream>
using namespace std;
int Maze[10][10];//迷宫
int Mark[10][10];//标记走过的点
struct MoveD{
int x;
int y;
}Move[4];
struct StepQueue{
int x;
int y;
int prePoint;
}QueueA[100],QueueB[100];
void SetMove(){
Move[0].x=1;
Move[0].y=0;
Move[1].x=-1;
Move[1].y=0;
Move[2].x=0;
Move[2].y=1;
Move[3].x=0;
Move[3].y=-1;
/*Move[4].x=-1;
Move[4].y=0;
Move[5].x=-1;
Move[5].y=-1;
Move[6].x=0;
Move[6].y=-1;
Move[7].x=1;
Move[7].y=-1;*/
}
void CreateMaze(){
int i,j;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
Maze[i][j]=0;
}
}
for(i=0;i<10;i++){
Maze[i][0]=1;
Maze[0][i]=1;
Maze[9][i]=1;
Maze[i][9]=1;
}
for(i=2;i<9;i++){
Maze[2][i]=1;
}
for(i=2;i<9;i++){
Maze[3][i]=1;
}
Maze[3][5]=0;
Maze[4][7]=1;
Maze[4][8]=1;
for(i=1;i<9;i++){
Maze[5][i]=1;
}
Maze[5][6]=0;
for(i=1;i<9;i++){
Maze[6][i]=1;
}
Maze[6][6]=0;
for(i=2;i<9;i++){
Maze[8][i]=1;
}
for(j=0;j<10;j++){
for(i=0;i<10;i++){
cout<<Maze[i][j];
}
cout<<endl;
}
}
int SearchQueue(int x1,int y1,int x2,int y2){
//(x1,y1)起点坐标 ,(x2,y2)终点坐标
int i,j;
int front,rear;
int x,y;
int v;
int k,l;
for(i=0;i<10;i++){
for(j=0;j<10;j++){
Mark[i][j]=0;
}
}
QueueA[1].x=x1;
QueueA[1].y=y1;
QueueA[1].prePoint=-1;
front=1;
rear=1;
Mark[x1][y1]=1;
while(front<=rear){
x=QueueA[front].x;
y=QueueA[front].y;
for(v=0;v<4;v++){
i=x+Move[v].x;
j=y+Move[v].y;
if((Mark[i][j]==0)&&(Maze[i][j]==0)){
rear++;
QueueA[rear].prePoint=front;
QueueA[rear].x=i;
QueueA[rear].y=j;
Mark[i][j]=1;
}
if(i==x2&&j==y2){
k=rear;
l=0;
while(k>0){
l++;
QueueB[l].x=QueueA[k].x;
QueueB[l].y=QueueA[k].y;
k=QueueA[k].prePoint;
}
while(l>0){
cout<<"("<<QueueB[l].x<<","<<QueueB[l].y<<")"<<endl;
l--;
}
return(1);
}
}
front++;
}
cout<<"没有通道能到达那一条通道。"<<endl;
return(0);
}
int main(){
//int i;
int x1,y1,x2,y2;//开始坐标(x1,y1);结束坐标(x2,y2)
//int l;//走的步数
CreateMaze();
SetMove();
cout<<"\n请输入起点坐标\n";
while(cin>>x1>>y1){
if(Maze[x1][y1]==1){
cout<<"你输入的初始起点为墙,请重新输入"<<endl;
}else{
break;
}
}
cout<<"\n请输入终点坐标\n";
while(cin>>x2>>y2){
if(Maze[x2][y2]==1){
cout<<"你输入的初始起点为墙,请重新输入"<<endl;
}else{
break;
}
}
SearchQueue(x1,y1,x2,y2);
system("pause");
return 0;
}
另外注意一点,如果起点到终点有两条路线的话,则每点都按右,左,上,下的Move[4]顺序取优先路线,因为如果右取了后,会将其Mark值更改为1,以后则不允许再走此路线了,每条路线只能走一次。