1. 程式人生 > >[USACO10OCT]湖計數Lake Counting 聯通塊

[USACO10OCT]湖計數Lake Counting 聯通塊

cstring tchar syn git const 一行 int ems one

題目描述

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. Given a diagram of Farmer John‘s field, determine how many ponds he has.

由於近期的降雨,雨水匯集在農民約翰的田地不同的地方。我們用一個NxM(1<=N<=100;1<=M<=100)網格圖表示。每個網格中有水(‘W‘) 或是旱地(‘.‘)。一個網格與其周圍的八個網格相連,而一組相連的網格視為一個水坑。約翰想弄清楚他的田地已經形成了多少水坑。給出約翰田地的示意圖,確定當中有多少水坑。

輸入輸出格式

輸入格式:

Line 1: Two space-separated integers: N and M * Lines 2..N+1: M characters per line representing one row of Farmer John‘s field. Each character is either ‘W‘ or ‘.‘. The characters do not have spaces between them.

第1行:兩個空格隔開的整數:N 和 M 第2行到第N+1行:每行M個字符,每個字符是‘W‘或‘.‘,它們表示網格圖中的一排。字符之間沒有空格。

輸出格式:

Line 1: The number of ponds in Farmer John‘s field.

一行:水坑的數量

輸入輸出樣例

輸入樣例#1: 復制
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
輸出樣例#1:
復制
3

說明

OUTPUT DETAILS: There are three ponds: one in the upper left, one in the lower left, and one along the right side.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 1000005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long  ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-4
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {
	ll x = 0;
	char c = getchar();
	bool f = false;
	while (!isdigit(c)) {
		if (c == ‘-‘) f = true;
		c = getchar();
	}
	while (isdigit(c)) {
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return f ? -x : x;
}

ll gcd(ll a, ll b) {
	return b == 0 ? a : gcd(b, a%b);
}
int sqr(int x) { return x * x; }


/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
	if (!b) {
		x = 1; y = 0; return a;
	}
	ans = exgcd(b, a%b, x, y);
	ll t = x; x = y; y = t - a / b * y;
	return ans;
}
*/

int n, m;
char ch[200][200];
int tot;
int a[200][200];
bool vis[200][200];
int dx[] = { 1,1,1,-1,-1,-1,0,0 };
int dy[] = { 0,1,-1,0,1,-1,1,-1 };

void dfs(int x, int y,int id) {
	vis[x][y] = id;
	for (int i = 0; i < 8; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (!vis[nx][ny] && a[nx][ny] == 1) {
			dfs(nx, ny, id);
		}
	}
}

int main() {
	//ios::sync_with_stdio(0);
	rdint(n); rdint(m);
	for (int i = 1; i <= n; i++)scanf("%s", ch[i] + 1);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (ch[i][j] == ‘W‘)a[i][j] = 1;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (a[i][j] == 1 && !vis[i][j]) {
				dfs(i, j, ++tot);
			}
		}
	}
	cout << tot << endl;
	return 0;
}

[USACO10OCT]湖計數Lake Counting 聯通塊