BFS
听y总讲到了flood fill, 就想起来了之前的城堡问题也是求不同连通块的面积。
这题是求以@为起点,求起点能经过的黑色地板,也就是联通块的面积,不过只有@一个起点。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N =200;
char g[N][N];
int n,m;
bool st[N][N];
pii q[N*N];
int ex,ey;
int sx,sy;
int ans;
int dis[N][N];
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
void bfs(int sx, int sy){
int hh = 0, tt = 0;
memset(dis,-1,sizeof(dis));
dis[sx][sy] = 0;
st[sx][sy] = true;
q[0] = {sx,sy};
//if在此处加上int ans = 0,则说明是遍历整个图,来找不同来联通块的面积
while(hh <= tt){
ans++;//算联通的区域面积
pii t = q[hh++];
for(int i = 0; i <4; i++){
int a = t.x + dx[i], b = t.y + dy[i];
if(a >= 0 && a < n && b >= 0 && b < m && !st[a][b] && g[a][b] == '.'){
dis[a][b] = dis[t.x][t.y] + 1;//算最短距离
st[a][b] = true;
q[++tt] = {a,b};
}
}
}
}
int main(){
while(scanf("%d%d",&m,&n) && (m != 0 && n != 0)){
memset(g,0,sizeof(g));
memset(st,0,sizeof(st));
memset(dis,-1,sizeof(dis));
ans = 0;
for(int i = 0; i < n; i++) cin >> g[i];
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(g[i][j] == '@'){
sx = i;
sy = j;
break;
}
}
}
bfs(sx,sy);
cout << ans << endl;
}
// ;
//
// cin >> ex >> ey;
// int res = -1;
// for(int i = 0; i < n; i++){
// for(int j = 0; j < m; j++){
// res = max(dis[i][j],res);
// }
// }
// cout << res << endl;
// cout << ans << endl;
return 0;
}
DFS
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 210;
char g[N][N];
int n,m;
int endx,endy;
int sx,sy;
bool st[N][N];
int ans = 1;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
int dfs(int sx, int sy){
g[sx][sy] = '#';//讲g[sx][sy] 从'.’弄成‘#’,来代替st数组来记录是否访问
// if(g[sx][sy] == '.') ans++;//错误的深搜写法
int res = 1;
// if(st[sx][sy]) return ;
// st[sx][sy] = true;
for(int i = 0; i < 4; i++){
int a = sx + dx[i], b = sy + dy[i];
if(a >= 0 && a < n && b >= 0 && b < m && g[a][b] == '.'){
res += dfs(a,b);
}
//下面为错误的注释代码
// if(!st[a][b] && g[a][b] != '#'){
// g[a][b] = '#';
// st[a][b] = true;
// dfs(a,b);
// st[a][b] = false;
// g[a][b] = '.';
// }
}
return res;
}
int main(){
while(scanf("%d%d",&m,&n) && (m != 0 && n != 0)){
// ans = 0;
// memset(g,0,sizeof(g));
for(int i = 0; i < n; i++) cin >> g[i];
// scanf("%d%d",&endx,&endy);
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(g[i][j]=='@'){
sx = i;
sy = j;
break;
}
}
}
// memset(st,0,sizeof(st));
cout << dfs(sx,sy) << endl;
}
// cout << ans << endl;
return 0;
}