···
//洪水覆盖算法
//第一种算法是宽度优先算法:bfs(可以求最短距离)
//宽搜用队列
//第二种算法是深度优先算法:dfs(暴栈)(更方便)
//深搜用递归回溯
//没有太大的区别
//万能头文件,编译会变慢
//#include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
//引入队列的头文件
include[HTML_REMOVED]
//第一个变量为x,第二个变量为y
define x first
define y second
using namespace std;
typedef pair[HTML_REMOVED] PII;
/*
访问两个元素(通过first和second):
pair[HTML_REMOVED] p1; //使用默认构造函数
p1.first = 1;
p1.second = 2.5;
cout << p1.first << ‘ ‘ << p1.second << endl;
输出结果:1 2.5
*/
int n,m;
const int N=25;
char a[N][N],b[N][N];
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int bfs(int sx,int sy){
queue[HTML_REMOVED] q;
q.push({sx,sy});
a[sx][sy]=’#’;
int res=0;
while(q.size()){
//便利的定义方法:
//auto的作用就是为了简化变量初始化,如果这个变量有一个很长很长的初始化类型,就可以用auto代替
PII t=q.front();
q.pop();
res++;
for(int i=0;i<4;i++){
//可以是 int x=t.first+dx[i],y=t.second+dy[i];
int x=t.x+dx[i],y=t.y+dy[i];
if(x<0||x>=n||y<0||y>=m||a[x][y]!='.')continue;
q.push({x,y});
a[x][y]='#';
}
}
return res;
}
int dfs(int sx,int sy){
int res=0;
b[sx][sy]=’#’;
res;
for(int i=0;i<4;i){
int x=sx+dx[i];
int y=sy+dy[i];
if(x[HTML_REMOVED]=0&&y[HTML_REMOVED]=0&&b[x][y]==’.’)
res+=dfs(x,y);
}
return res;
}
int main(){
int sx=-1;
int sy=-1;
while(cin>>m>>n&&m&&n){
for(int i=0;i<n;i++){
cin>>a[i];
for(int j=0;j<m;j++){
if(a[i][j]=='@'){
sx=i,sy=j;
}
b[i][j]=a[i][j];
}
}
cout<<bfs(sx,sy)<<endl;
cout<<dfs(sx,sy)<<endl;
}
}
···