vjudge Lake Counting 搜索 水池 8方向

原题链接https://vjudge.net/contest/331118#problem/A

题目:

现在有一个M*N的方阵,每个格子里面是.或者W,点代表水,然后如果在这个点的周围,即8个方向内还有w,那么可以连成一片,即这两个w看作为1个

输入:M N, 还有方阵

输出:有几个水池

样例输入

10 12
W       .       .      .       .       .      .      .      .       W      W      .
.        W     W    W     .       .      .      .      .       W      W     W   
.        .        .      .      W     W    .       .      .       W      W      .
.        .        .      .       .       .      .       .      .       W      W      .
.        .        .      .       .       .      .       .      .       W       .       .
.        .       W     .       .       .      .       .      .       W       .       .
.       W      .      W      .       .     .        .      .      W       W      .
W     .        W    .      W       .     .       .       .      .         W       .
.       W      .     W      .        .     .        .       .      .        W       .
.       .        W    .        .        .     .        .      .      .         W      .

 注释:这里相邻两个字符之间的空格是为了方便看,实际输入的时候是没有的

样例输出

3

代码:

#include<stdio.h>
#include<iostream>
using namespace std;
int sum=0;
char G[105][105];
bool vis[105][105];
int n,m,d[8]= {-1,-1,-1,0, 0, 1,1,1};
int     z[8]= {-1, 0, 1,-1,1,-1,0,1};  //8个方向
void dfs(int q,int w) {
 if(G[q][w]=='W'&&!vis[q][w]&&q<=n&&w<=m && q>0 && w>0) {
  vis[q][w]=true;
  for(int i=0; i<8; i++) {
   if(G[q+d[i]][w+z[i]]=='W'   &&    !vis[q+d[i]][w+z[i]]     &&(q+d[i])<=n&&(w+z[i])<=m &&(q+d[i])>0&&(w+z[i])>0 ) {
    dfs(q+d[i],w+z[i]);
   }
  }
 }
}
int main() {
 cin >> n >> m;
 for(int i=1; i<=n; i++) {
  scanf("%s",G[i]+1);
 }
 for(int q=1; q<=n; q++) {
  for(int w=1; w<=m; w++) {
   if(G[q][w]=='W' && !vis[q][w]) sum++;
   dfs(q,w);
  }
 }
 cout<<sum;
 return 0;
}

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11625525.html