#include <iostream>
#include <stdlib.h>
#define num 1024
using namespace std;
typedef struct node{
int x,y;
int pre; //指向前驱点的坐标
}SqType;
typedef struct{
int x,y;
}item;
/*创建迷宫数组*/
int** CreateMaze(int **maze,int m,int n){
//初始化数组
for(int i=0;i<m+2;i++){
for(int j=0;j<n+2;j++){
maze[i][j]=1;
}
}
//给数组赋值
for(int k=1;k<m+1;k++){
for(int q=1;q<n+1;q++){
int x;
//cout<<"please enter "<<'('<<k<<","<<q<<')'<<" number:";
cin>>x;
maze[k][q]=x;
}
}
return maze;
}
/*定义在不同方向上坐标的变化*/
item assignMove(item moveEle[8]){
for (int i = 0; i < 8; i++)
{
switch(i){
case 0:moveEle[0].x=1;moveEle[0].y=0;break;
case 1:moveEle[1].x=1;moveEle[1].y=1;break;
case 2:moveEle[2].x=0;moveEle[2].y=1;break;
case 3:moveEle[3].x=-1;moveEle[3].y=1;break;
case 4:moveEle[4].x=-1;moveEle[4].y=0;break;
case 5:moveEle[5].x=-1;moveEle[5].y=-1;break;
case 6:moveEle[6].x=0;moveEle[6].y=-1;break;
case 7:moveEle[7].x=1;moveEle[7].y=-1;break;
}
}
return moveEle[8];
}
/*打印路线*/
void printPath(SqType *sq,int rear){
int i=rear;
while(i!=-1){
cout<<sq[i].x<<" "<<sq[i].y<<" "<<endl;
i=sq[i].pre;
}
}
/*利用队列求最短路径*/
void path(int **maze,int m,int n){ //*((int*)pia3 + i * 4 + j)
item moveEle[8];
moveEle[8]=assignMove(moveEle);
SqType sq[num];
int front,rear;
int x,y,i,j,v;
sq[0].x=1;sq[0].y=1;sq[0].pre=-1;
front=rear=0;
maze[1][1]=-1; //标记已经过的位置
while(front<=rear){
x=sq[front].x;y=sq[front].y;
for(v=0;v<8;v++){
i=x+moveEle[v].x;j=y+moveEle[v].y;
if(maze[i][j]==0){
rear++;
sq[rear].x=i;sq[rear].y=j;sq[rear].pre=front;
maze[i][j]=-1;
}
if(i==m && j==n){
printPath(sq,rear); //打印路线
}
}
front++;
}
}
int main()
{
int m,n;
cout<<"row:";
cin>>m;
cout<<"column:";
cin>>n;
//创建迷宫数组
int **maze=new int *[m+2];
for (int i = 0; i < m+2; i++)
{
maze[i]=new int[n+2];
}
maze=CreateMaze(maze,m,n);
//寻找迷宫最短路径
path(maze,m,n);
system("pause");
return 0;
}
【C++】使用队列求迷宫最短路径
最新推荐文章于 2024-04-07 16:28:15 发布