代码1(dfs)
#include<iostream>
#include<cstring>
using namespace std;
const int N=25;
char f[N][N];
int d[N][N];
int res;
int x[4]={0,0,-1,1};
int y[4]={1,-1,0,0};
void dfs(int l,int r,int n,int m){
d[l][r]=0;
res++;
for(int i=0;i<4;i++){
int a=x[i]+l;
int b=y[i]+r;
if(a>=1&&a<=n&&b>=1&&b<=m&&f[a][b]=='.'&&d[a][b]==-1){
d[l][r]=0;
dfs(a,b,n,m);
}
}
}
int main(){
int n,m;
while(1){
cin>>n>>m;
if(n==0&&m==0){
break;
}
int l;
int r;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>f[i][j];
if(f[i][j]=='@'){
l=i,r=j;
}
}
}
memset(d,-1,sizeof d);
d[l][r]=0;
dfs(l,r,m,n);
cout<<res<<endl;
res=0;
}
return 0;
}
代码2(bfs)
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=25;
char f[N][N];
int d[N][N];
typedef pair<int,int>pii;
int bfs(int l,int r,int n,int m){
queue<pii>res;
memset(d,-1,sizeof d);
d[l][r]=0;
res.push({l,r});
int x[4]={0,0,-1,1};
int y[4]={1,-1,0,0};
int mm=1;
while(!res.empty()){
auto temp=res.front();
res.pop();
for(int i=0;i<4;i++){
int a=x[i]+temp.first;
int b=y[i]+temp.second;
if(a>=1&&a<=n&&b>=1&&b<=m&&f[a][b]=='.'&&d[a][b]==-1){
d[a][b]=d[temp.first][temp.second]+1;
mm++;
res.push({a,b});
}
}
}
return mm;
}
int main(){
int n,m;
while(1){
cin>>m>>n;
if(n==0&&m==0)
break;
int l,r;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>f[i][j];
if(f[i][j]=='@')
l=i,r=j;
}
}
int t=bfs(l,r,n,m);
cout<<t<<endl;
}
return 0;
}
对比bfs与dfs
可以明显看出,bfs的代码要比dfs长很多,但是bfs是固定思路,简单,dfs灵活性较高,但是步骤不复杂,
一定要记住,不管是dfs还是bfs都需要对已经判定过的点进行标记,不能再次访问,如果不做标记一直循环就会tle
对于dfs,在哪里标记一定要想好,如果标记不当就是答案错误甚至tle;什么时候该循环进行下一个dfs()也一定要想好!!!