1. BFS模板
按层次的顺序进行遍历:
void BFS(int s){
queue<int> q;
q.push(s);
while(){
取出队首元素top;
访问队首元素;
将队首元素出队;
将top的下一层结点未入队的结点全部入队,并设置为已入队;
}
}
2. 详细说明
- 定义队列q,并将队首s入队
- 写一个while循环,循环条件是队列q非空
- 在while循环中,先取队首元素top,并访问它(访问:可以是任何事,比如将其输出),将其出队
- 将top的下一层结点中所有未曾入队的元素入队,并标记它们的层号为now+1,同时设置这些入队的结点已入队
- 返回(2)继续循环
3. 实际应用
代码:
#include <cstdio>
#include <queue>
using namespace std;
const int maxn = 100;
struct node{
int x,y;
}Node;
int n,m;
int matrix[maxn][maxn];
bool inq[maxn][maxn] = {false};
int X[4] = { 0 , 0 , 1 , -1 };
int Y[4] = { 1 , -1 , 0 , 0 };
bool judge(int x , int y){
if(x >= n || x < 0 || y >= m || y < 0){
return false;
}
if(matrix[x][y] == 0 || inq[x][y] == true){
return false;
}
return true;
}
void BFS(int x , int y){
queue<node> Q;
Node.x = x;
Node.y = y;
Q.push(Node);
inq[x][y] = true;
while(!Q.empty()){
node top = Q.front();
Q.pop();
for(int i = 0 ; i < 4 ;i++){
int newX = top.x +X[i];
int newY = top.y +Y[i];
if(judge(newX,newY)){
Node.x = newX ;
Node.y = newY ;
Q.push(Node) ;
inq[newX][newY] = true ;
}
}
}
}
int main(){
scanf("%d %d" , &n , &m);
for(int x = 0 ; x < n ; x++){
for(int y = 0 ; y < m ; y++){
scanf("%d",&matrix[x][y]);
}
}
int ans = 0;
for(int x = 0 ; x < n ; x++){
for(int y = 0 ; y < m ; y++){
if(matrix[x][y] == 1 && inq[x][y] == false){
ans ++ ;
BFS(x,y);
}
}
}
printf("%d\n",ans);
return 0;
}
4. 题目
代码:
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 100;
struct node{
int x,y;
int step;
}S,T,Node;
int n,m;
char matrix[maxn][maxn];
bool inq[maxn][maxn] = { false };
int X[4] = { 0 , 0 , 1 , -1 };
int Y[4] = { 1 , -1 , 0 , 0 };
bool judge(int x , int y){
if(x >= n || x < 0 || y >= m || y < 0){
return false;
}
if(matrix[x][y] == '*' || inq[x][y] == true){
return false;
}
return true;
}
int BFS(){
queue<node> Q;
Q.push(S);
while(!Q.empty()){
node top = Q.front();
Q.pop();
if(top.x == T.x && top.y == T.y){
return top.step;
}
for(int i = 0 ; i < 4 ;i++){
int newX = top.x + X[i];
int newY = top.y + Y[i];
if(judge(newX,newY)){
Node.x = newX ;
Node.y = newY ;
Node.step = top.step + 1;
Q.push(Node) ;
inq[newX][newY] = true ;
}
}
}
return -1;
}
int main(){
scanf("%d %d",&n,&m);
for(int x = 0 ; x < n ; x++){
getchar();
for(int y = 0 ; y < m ; y++){
matrix[x][y] = getchar();
}
matrix[x][m+1] ='\0';
}
scanf("%d%d%d%d",&S.x,&S.y,&T.x,&T.y);
S.step = 0;
printf("%d\n",BFS());
return 0;
}