C++迷宫问题的求解算法
解决迷宫问题的算法种类很多,其中最常见的算法是回溯法和广度优先搜索。这里分别介绍这两种算法的实现以及具体的问题求解方式。
回溯法
回溯法是一种遍历所有解空间的算法,当我们在一条路径上探索到某条路程时,发现这条路无法到达正确的终点,我们就返回到上一个路口重新探索其他路径。这里我们以递归方式实现回溯法,其中每个节点的四个方向按照顺序依次探索。示例代码如下:
#include <iostream>
#include <vector>
using namespace std;
int n=5,m=5;//n表示行,m表示列
vector<vector<int>>maze(n,vector<int>(m,0));//迷宫,0表示通路,1表示障碍物
bool dfs(int x,int y){
if(x<0||x>=n||y<0||y>=m)//边界判断
return false;
if(maze[x][y]==1)//障碍物判断
return false;
if(x==n-1&&y==m-1)//到达终点
return true;
//继续探索四个方向
maze[x][y]=1;//标记当前位置已经走过
bool flag=dfs(x+1,y)||dfs(x-1,y)||dfs(x,y+1)||dfs(x,y-1);
maze[x][y]=0;//回溯状态
return flag;
}
int main(){
//初始化迷宫状态
maze[1][3]=1;
maze[2][1]=1;
maze[2][2]=1;
maze[3][3]=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
cout<<maze[i][j]<<" ";
cout<<endl;
}
cout<<endl;
if(dfs(0,0))
cout<<"可以到达终点"<<endl;
else
cout<<"无法到达终点"<<endl;
return 0;
}
运行结果:
0 0 0 0 0
0 0 0 1 0
0 1 1 0 0
0 0 1 1 0
0 0 0 0 0
可以到达终点
广度优先搜索
广度优先搜索是一种按照节点位置和深度遍历的搜索算法,可以直接求解最短路径问题。其实现过程主要包括状态表示、状态扩展及状态判断。示例代码如下:
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct Node{
int x,y,step;//节点的位置和步数
};
int n=5,m=5;
vector<vector<int>>maze(n,vector<int>(m,0));
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//四个方向
bool bfs(int x,int y){
queue<Node> q;
Node start={x,y,0};
maze[x][y]=1;
q.push(start);
while(!q.empty()){
Node cur=q.front();
q.pop();
if(cur.x==n-1&&cur.y==m-1){ //到达终点
cout<<"迷宫最短距离为"<<cur.step<<endl;
return true;
}
//四个方向的扩展
for(int i=0;i<4;i++){
int nx=cur.x+dir[i][0];
int ny=cur.y+dir[i][1];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]==0){//判断是否越界和走到障碍物
Node next={nx,ny,cur.step+1};//下一个状态
maze[nx][ny]=1;//标记当前位置已经走过
q.push(next);//入队
}
}
}
return false;//无法到达终点
}
int main(){
//初始化迷宫状态
maze[1][3]=1;
maze[2][1]=1;
maze[2][2]=1;
maze[3][3]=1;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
cout<<maze[i][j]<<" ";
cout<<endl;
}
cout<<endl;
if(bfs(0,0))
cout<<"可以到达终点"<<endl;
else
cout<<"无法到达终点"<<endl;
return 0;
}
运行结果:
0 0 0 0 0
0 0 0 1 0
0 1 1 0 0
0 0 1 1 0
0 0 0 0 0
迷宫最短距离为8
可以到达终点
以上就是C++迷宫问题的求解算法的完整攻略和示例说明,希望对你有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++迷宫问题的求解算法 - Python技术站