概述
BFS宽度优先搜索
- 1.走迷宫
- (1)最短距离
- (2)输出路径
- 2.八数码
1.走迷宫
(1)最短距离
#include<bits/stdc++.h>
using namespace std;
const int N=110;
typedef pair<int,int> pii;
int n,m;
int g[N][N];//输入的图
int d[N][N];//点的距离
pii q[N*N];//队列存储
int bfs()
{
int hh=0,tt=0;//hh=-1
q[0]={0,0}; //起始点
memset(d,-1,sizeof d);//标记是否走过该点
d[0][0]=0; //从(0,0)开始走
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};// 四个方向操作
while(hh<=tt)
{
pii t=q[hh++]; //++hh 取队头
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];//处理四个方向的操作
if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&d[x][y]==-1)//不超出边界+该点可以走的条件+该点没有走过的条件
{
d[x][y]=d[t.first][t.second]+1; //下一点距离=本点距离+1
q[++tt]={x,y}; //该点点存入队列
}
}
}
return d[n-1][m-1];
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&g[i][j]);
printf("%dn",bfs());
return 0;
}
(2)输出路径
//路径输出
#include<bits/stdc++.h>
using namespace std;
const int N=110;
typedef pair<int,int> pii;
int n,m;
int g[N][N];
int d[N][N];
pii q[N*N],pre[N][N];
void bfs()
{
int hh=0,tt=0;//hh=-1
q[0]={0,0};
memset(d,-1,sizeof d);
d[0][0]=0;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
while(hh<=tt)
{
pii t=q[hh++];//++hh
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&d[x][y]==-1)
{
d[x][y]=d[t.first][t.second]+1;
pre[x][y]=t; //存本点(x,y)的前一点(t.first,t.second)
q[++tt]={x,y};
}
}
}
int x=n-1,y=m-1;
while(x||y) //不到初始点就继续循环
{
printf("%d %dn",x,y); //输出路径
//t=前一点坐标,该处进行路径返还
pii t=pre[x][y];
x=t.first,y=t.second;
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&g[i][j]);
bfs();
return 0;
}
2.八数码
#include <iostream>
#include <algorithm>
#include <queue>
#include <unordered_map>
using namespace std;
int bfs(string start)
{
//定义目标状态
string end = "12345678x";
//定义队列和dist数组
queue<string> q;
unordered_map<string, int> d;
//初始化队列和dist数组
q.push(start);
d[start] = 0;
//转移方式
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
while(q.size())
{
auto t = q.front();
q.pop();
//记录当前状态的距离,如果是最终状态则返回距离
int distance = d[t];
if(t == end) return distance;
//查询x在字符串中的下标,然后转换为在矩阵中的坐标
int k = t.find('x');
int x = k / 3, y = k % 3;
for(int i = 0; i < 4; i++)
{
//求转移后x的坐标
int a = x + dx[i], b = y + dy[i];
//当前坐标没有越界
if(a >= 0 && a < 3 && b >= 0 && b < 3)
{
//转移x
swap(t[k], t[a * 3 + b]);
//如果当前状态是第一次遍历,记录距离,入队
if(!d.count(t))
{
d[t] = distance + 1;
q.push(t);
}
//还原状态,为下一种转换情况做准备
swap(t[k], t[a * 3 + b]);
}
}
}
//无法转换到目标状态,返回-1
return -1;
}
int main()
{
string c, start;
//输入起始状态
for(int i = 0; i < 9; i++)
{
cin >> c;
start += c;
}
cout << bfs(start) << endl;
return 0;
}
最后
以上就是柔弱鼠标为你收集整理的2.BFS宽度优先搜索(模板)1.走迷宫2.八数码的全部内容,希望文章能够帮你解决2.BFS宽度优先搜索(模板)1.走迷宫2.八数码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复