2019/01/19更新
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int w,h;
char a[25][25];
int ans=0;
bool check(int i,int j){
if(a[i][j]=='#'||i<0||i>=h||j<0||j>=w)return false;
else return true;
}
void dfs(int i,int j){
if(check(i,j)){
a[i][j]='#';//记得标记!
ans++;
dfs(i-1,j);
dfs(i,j-1);
dfs(i,j+1);
dfs(i+1,j);
}
}
int main(){
while(cin>>w>>h&&w){
ans=0;
for(int i=0;i<h;++i)
scanf("%s",a[i]);
for(int i=0;i<h;++i){
for(int j=0;j<w;++j){
if(a[i][j]=='@'){
dfs(i,j);
break;
}
}
}
printf("%d\n",ans);
}
}
注意:
1.联通块 搜完这个记得标记!
2.判断越界 不要搞错 i-h, j-w
3.ans记的是啥 想清楚
真的超级开心了,第一个完完全全自己写的dfs
#include<cstring>
#include<iostream>
using namespace std;
char a[25][25];
int ans=1;
int w,h;
void dfs(int x,int y){
if(x-1>=0&&a[x-1][y]=='.'){
a[x-1][y]='#';
ans++;
dfs(x-1,y);
}
if(x+1<h&&a[x+1][y]=='.'){
a[x+1][y]='#';
ans++;
dfs(x+1,y);
}
if(y-1>=0&&a[x][y-1]=='.'){
a[x][y-1]='#';
ans++;
dfs(x,y-1);
}
if(y+1<w&&a[x][y+1]=='.'){
a[x][y+1]='#';
ans++;
dfs(x,y+1);
}
return;
}
int main(){
while(cin>>w>>h&&w){
ans=1;
for(int i=0;i<h;i++)
scanf("%s",&a[i]);
for(int i=0;i<h;i++)
for(int j=0;j<w;j++)
if(a[i][j]=='@') {
dfs(i,j);
break;
}
cout<<ans<<endl;
}
}
改进版
#include<cstring>
#include<iostream>
using namespace std;
char a[25][25];
int dr[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int ans=1;
int h,w;//行,列
void dfs(int x,int y){
for(int i=0;i<4;i++){
int nx=x+dr[i][0];
int ny=y+dr[i][1];
if(nx>=0&&nx<h&&ny>=0&&ny<w&&a[nx][ny]=='.'){
a[nx][ny]='#';
ans++;
dfs(nx,ny);
}
}
return;
}
int main(){
while(cin>>w>>h&&w){//w是列,h是行
ans=1;
for(int i=0;i<h;i++)//行
scanf("%s",&a[i]);
for(int i=0;i<h;i++)//行
for(int j=0;j<w;j++)//列
if(a[i][j]=='@') {
dfs(i,j);
break;
}
cout<<ans<<endl;
}
}