寻找迷宫最短路。
由于BFS的性质是一步一步往下找,像水波一样,自身周围有路先把每个第一步都走完在走下一步。
代码实现使用队列。 首先把出发点入队,然后搜索周边的点,把他们分别放入队列一个一个解决掉;
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
int n,m;
const int N = 1e3+10;
char map[N][N];
int vis[N][N];
struct node{
int x,y;
int step;
};
queue<node>q;
int dirx[] = {0,1,-1,0,0};
int diry[] = {0,0,0,1,-1};
bool check(int x, int y){
if (x < 1 || x > n || y < 1 || y > m) return false;
if (map[x][y] == '#' || vis[x][y] == 1) return false;
return true;
}
void bfs(int x, int y,int step){
vis[x][y] = 1;
node now,nxt;
now.x = x;
now.y = y;
now.step = step;
q.push(now);
//找周围四个点
while (q.size() != 0){
now = q.front();
q.pop();
for (int i = 1; i <= 4; i++) {
nxt.x = now.x+dirx[i];
nxt.y = now.y+diry[i];
nxt.step = now.step+1;
if (check(nxt.x,nxt.y)){
q.push(nxt);
vis[nxt.x][nxt.y] = 1;
}
if (nxt.x == n && nxt.y == m){
cout << "YES" << endl;
return;
}
}
}
cout << "NO" << endl;
}
int main(){
cin >> n >> m;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
cin >> map[i][j];
}
}
bfs(1,1,0);
}
拓扑排序(BFS的应用)
哈利用一个魔法电脑处理N个任务,但是有M个前后关系(a,b), 意思是在b执行之前必须先执行a,即a任务在b任务前,问你是否能满足要求 处理完这N个任务。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N = 1e3+10;
int n,m,a,b;
int map[N][N];
int in[N];
int vis[N];
//void BFS(){
// queue<int>q;
// for (int i = 1; i <= n; i++){
// if (in[i] == 0){
// q.push(i);
// vis[i] = 1;
// }
// }
// while (q.size() != 0){
// int now = q.front();
// q.pop();
// for (int i = 1; i <= n; i++){
// if (map[now][i] == 1){
// in[i]--;
// if (in[i] == 0){
// q.push(i);
// vis[i] = 1;
// }
// }
// }
// }
// int cnt = 0;
// for (int i = 1; i <= n; i++){
// if (vis[i] == 1) cnt++;
// }
// if (cnt == n) cout << "YES";
// else cout << "NO";
//}
void BFS(){
queue<int>q;
for (int i = 1; i <= n; i++){
if (in[i] == 0){
q.push(i);
vis[i] = 1;
}
}
while (q.size() != 0){
int now = q.front();
q.pop();
for (int i = 1; i <= n; i++){
if (map[now][i] == 1){
in[i]--;
if (in[i] == 0){
q.push(i);
vis[i] = 1;
}
}
}
}
int cnt = 0;
for (int i = 1; i <= n; i++){
if (vis[i] == 1) cnt++;
}
if (cnt == n) cout << "YES";
else cout << "NO";
}
int main(){
cin >> n >> m;
for (int i = 1; i <= m; i++){
cin >> a >> b;
map[a][b] = 1;
in[b]++;
}
BFS();
return 0;
}