如果DFS是时光回溯,那么BFS则是影子分身。
下面是它的定义:
下面直接看题:
十分经典,在这注意存的时候可以用i*m+j的形式,可以当作模板,下面是AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,t1,x,y;
char a[600][600];
int a1[600][600];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int main(){
cin>>t1;
while(t1--){
queue<int> q;
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
if(a[i][j]=='s'){
x=i;
y=j;
}
}
}
memset(a1,0,sizeof(a1));
a1[x][y]=1;
int f=0;
q.push(x*m+y);
while(!q.empty()){
int tmp=q.front();
int x1=tmp/m;
int y1=tmp%m;
q.pop();
if(a[x1][y1]=='t'){
f=1;
}
for(int i=0;i<4;i++){
int x2=x1+dir[i][0];
int y2=y1+dir[i][1];
if(x2>=0&&x2<n&&y2>=0&&y2<m&&a1[x2][y2]==0&&a[x2][y2]!='x'){
q.push(x2*m+y2);
a1[x2][y2]=1;
}
}
}
if(f==0) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
接题:
因为求最少步,用BFS,复杂度为n*m(每个点只走一次)
下面是AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
int a[500][500];
int dir[8][2]={{-1,-2},{-2,-1},{-1,2},{2,-1},{-2,1},{2,1},{1,-2},{1,2}};
int main(){
cin>>n>>m>>x>>y;
queue<int> q;
x--;
y--;
memset(a,-1,sizeof(a));
q.push(x*m+y);
a[x][y]=0;
while(!q.empty()){
int tmp=q.front();
q.pop();
int x1=tmp/m;
int y1=tmp%m;
for(int i=0;i<8;i++){
int x2=x1+dir[i][0];
int y2=y1+dir[i][1];
if(x2>=0&&x2<n&&y2>=0&&y2<m&&a[x2][y2]==-1){
q.push(x2*m+y2);
a[x2][y2]=a[x1][y1]+1;
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}