Language:Default Lake Counting
Description Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors. Input * Line 1: Two space-separated integers: N and M Output * Line 1: The number of ponds in Farmer John's field. Sample Input Sample Output |
题意:寻找图中有多少条河
思路:dfs和bfs都可以解决,解为bfs或dfs的次数,遇到‘W’,就把它置为‘.’
dfs AC代码:
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 100+10;
char mp[MAXN][MAXN];
bool used[MAXN][MAXN];
int n,m;
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
void init(){
memset(used,false,sizeof(used));
for(int i=0;i<MAXN;i++){
for(int j=0;j<MAXN;j++){
mp[MAXN][MAXN]='\0';
}
}
}
void Myscanf(){
getchar();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&mp[i][j]);
}
getchar();
}
}
void dfs(int i,int j){
used[i][j]=true;
mp[i][j]='.';
for(int k=0;k<8;k++){
int di=i+dir[k][0];
int dj=j+dir[k][1];
if(di>=0 && di<n && dj>=0 && dj<m && used[di][dj]==false && mp[di][dj]=='W'){
dfs(di,dj);
}
}
}
void solve(){
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='W' && used[i][j]==false){
ans++;
dfs(i,j);
}
}
}
printf("%d\n",ans);
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
Myscanf();
solve();
}
return 0;
}
bfs AC代码:
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int MAXN =100+10;
int n,m;
char G[MAXN][MAXN];
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
typedef pair<int,int> P;
queue<P> que;
void init(){
while(!que.empty()){
que.pop();
}
memset(G,'\0',sizeof(G));
}
void Myscanf(){
getchar();
int a,b;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&G[i][j]);
}
getchar();
}
}
void bfs(P node){
while(!que.empty()){
P temp=que.front();
G[temp.first][temp.second]='.';
que.pop();
for(int i=0;i<8;i++){
int di=temp.first+dir[i][0];
int dj=temp.second+dir[i][1];
if(G[di][dj]=='W'){
G[di][dj]='.';
que.push(P(di,dj));
}
}
}
}
void solve(){
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(G[i][j]=='W'){
ans++;
G[i][j]='.';
que.push(P(i,j));
bfs(P(i,j));
}
}
}
printf("%d\n",ans);
}
int main(){
while(~scanf("%d%d",&n,&m)){
init();
Myscanf();
solve();
}
return 0;
}