暂且只用DFS做着,用BFS我老wa“哇。。桑心”,会补上的,我提么就不信了。
DFS:
#include<stdio.h>
#include<string.h>
const int N = 105;
int a[N][N],b[N][N];
char c[N][N];
int px[8]= {0,0,1,1,1,-1,-1,-1};
int py[8]= {-1,1,-1,0,1,-1,0,1};
int m,n;
void dfs(int x,int y) {
c[x][y]='*';
//printf("--%d %d--\n",x,y);
for(int l=0; l<8; l++) {
int nx=x+px[l];
int ny=y+py[l];
if(c[nx][ny]=='@'&&b[nx][ny]==0&&nx>=0&&ny>=0&&nx<m&&ny<n) {
bfs(nx,ny);
}
}
}
int main() {
while(scanf("%d%d",&m,&n),m||n) {
for(int i=0; i<m; i++)
scanf("%s",c[i]);
int sum=0;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(c[i][j]=='@) {
bfs(i,j);
sum++;
//printf("--%d--\n",sum);
}
}
}
printf("%d\n",sum);
}
return 0;
}
http://poj.org/problem?id=1562
很久没看bfs了回来回顾一下,好像这道题当时用bfs没能过,那么现在写一下吧,略水;
ac代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN = 105;
char cc[MAXN][MAXN];
bool vis[MAXN];
int px[8]={0,0,-1,-1,-1,1,1,1};
int py[8]={-1,1,-1,0,1,-1,0,1};
struct Node{
int u,v;
}s;
bool check(int x,int y){
if(x>=0&&y>=0&&cc[x][y]=='@')
return true;
return false;
}
void bfs(int x,int y){
queue<Node>Q;
s.u=x,s.v=y;
Q.push(s);
while(!Q.empty()){
Node begin,end;
begin=Q.front();
Q.pop();
cc[begin.u][begin.v]='*';//每出队就修改其为“*”,原理上和深搜一样;
for(int i=0;i<8;i++){
end.u=begin.u+px[i];
end.v=begin.v+py[i];
if(check(end.u,end.v)){
Q.push(end);
}
}
}
}
int main(){
int m,n;
while(scanf("%d",&m)!=EOF){
int ans=0;
if(m==0)
break;
scanf("%d",&n);
for(int i=0;i<m;i++){
scanf("%s",cc[i]);
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(cc[i][j]=='@'){
bfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}