目录
算法核心:
1.先将起始位置的坐标入队,并标记已经访问。
2.当队列不空情况下进行以下操作:
得到队首元素的坐标。
判断得到的坐标是否是出口坐标,如果是就跳出循环。
判断它的周围四个方向是否可以进行访问,(已经访问过的,就不能在进行访问),将能访问的坐标依次进行入队,并标记已近访问过。
3.
代码:
#include<iostream>
#include<queue>
using namespace std;
typedef pair <int ,int>p;//定义一个数对
int main(){
int a[4][6]={{0,1,0,0,0,0},{0,0,0,1,0,0},{0,0,1,0,0,1},{1,1,0,0,0,0}};//构造迷宫图
queue<p>Q;//定义一个队列
int sum[4][6];//用它来表示走到该坐标需要几步
int i,j,c,d;//起始位置坐标和出口位置位置坐标
cin>>i>>j>>c>>d;//输入起点坐标和出口坐标
sum[i][j]=0; //到起点需要的步数为零
Q.push(p(i,j));//让起点坐标入队
a[i][j]=2;//标记已经访问
int dx[4]={1,-1,0,0};//表示四个方向
int dy[4]={0,0,1,-1};
while(!Q.empty()){
i=Q.front().first;//得到队首坐标
j=Q.front().second;
Q.pop();//删除队首坐标
if(i==c && j==d)
break;
for(int k=0;k<4;k++){//判断四个方向的能否访问或则是否被访问过,能访问将坐标入队
if(i+dx[k]>=0 && i+dx[k]<=5 && j+dy[k]>=0 &&j+dy[k]<=5 && a[i+dx[k]][j+dy[k]]==0){
Q.push(p(i+dx[k],j+dy[k]));//将坐标入队
a[i+dx[k]][j+dy[k]]=2;//标记已经访问
sum[i+dx[k]][j+dy[k]]=sum[i][j]+1;//记录次数
}
}
}
for(int o=0;o<4;o++){//打印迷宫
for(int p=0;p<6;p++){
cout<<a[o][p]<<" ";//此算法是广度优先搜索,它实际是走过了所有能走的路。
}
cout<<endl;
}
cout<<sum[c][d]<<endl;//输出到出口需要走的步数
return 0;
}