BFS
广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略。因为它的思想是从一个顶点开始,辐射状地优先遍历其周围较广的区域,因此得名。
参考资料:BFS——广度优先算法(Breadth First Search)-CSDN博客
走迷宫
//测试实例走迷宫
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 110;
int n,m;
typedef pair<int ,int > pii;
int g[N][N];
int d[N][N];
pii q[N*N];//模拟队列
int bfs(){
int hh = 0,tt =0;
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++];
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;
q[++tt] = {x,y};
}
}
}
return d[n-1][m-1];
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 0;i<n;i++)
for(int j = 0;j<m;j++)
scanf("%d",&g[i][j]);
printf("%d",bfs());
return 0;
}
八数码
//测试实例,八数码
#include<iostream>
#include<unordered_map>
#include<queue>
#include<algorithm>
using namespace std;
int bfs(string s){
string end = "12345678x";
queue<string> q;
unordered_map <string,int> d;
//初始化
q.push(s);
d[s] = 0;
//寻找更换
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
while(q.size()){
string t = q.front();
q.pop();
int distance = d[t];
if(t == end) return distance;
//寻找下标和坐标转换
int k = t.find('x');
int x = k/3,y=k%3;
for(int i = 0;i<4;i++){
int a = x+dx[i], b = y+dy[i];
if(a>=0&&a<3&&b>=0&&b<3){
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]);
}
}
}
return -1;
}
int main(){
char c;
string s;
for(int i = 0;i<9;i++){
cin>>c;
s+=c;
}
//cout<<s<<endl;
cout<<bfs(s)<<endl;
return 0;
}