题目大意:
由于最近的阴雨天,FJ的农田(N × M的矩形区域,表示共有NM块正方形,其中1 ≤ N, M ≤ 100)的很多区域都被灌水了,区域中每一块不是有水就是干的,有水用字符'W'表示,干的用字符'.'表示,现规定:和一块水相邻8块中有水的和中间的相连,可以组成一块池塘,现要帮助FJ统计他的农田中一共有多少池塘。
现只有一个测例,测例以N和M开始,接下来N行将输入一个N × M的矩阵,用'W'和'.'表示,每个字符之间没有空格,要求输出池塘中共有多少个池塘。
注释代码:
/*
* Problem ID : POJ 2386 Lake Counting
* Author : Lirx.t.Una
* Language : C
* Run Time : 0 ms
* Run Memory : 416 KB
*/
#include <stdio.h>
#define MAXLEN 100
//field
//池塘,行用字符串接收要考虑末尾的'\0'
char fd[MAXLEN][MAXLEN + 1];
int n, m;//池塘的行列数
void
dfs( int x, int y ) {//深搜
//表示当前W处的坐标
int dx, dy;//表示向量(dx, dy)可以走上下左右斜角8个方向
int xx, yy;//表示走过一步后的坐标
fd[x][y] = '.';//将W处改为'.'表示搜索过了
for ( dx = -1; dx <= 1; dx++ )
for ( dy = -1; dy <= 1; dy++ ) {
if ( !dx && !dy ) continue;//原地不动
//走一步
xx = x + dx;
yy = y + dy;
//走出池塘外部的不算并且找出与之相连的W处进行下一轮深搜
if ( xx >= 0 && xx < n && yy >= 0 && yy < m && 'W' == fd[xx][yy] )
dfs( xx, yy );
}
return ;
}
int
main() {
int i, j;//计数变量
int ans;//水洼的最终个数
//思路是对一个W处的周围8块进行DFS,因此可以找出互连的最大一片水洼
//寻找完之后需要将这一整片DFS过的区域都标记为“已经搜索过”的
//不如直接这些区域都改为'.'更加方便,这样就可以避免之后的重复搜索这些区域
scanf("%d%d\n", &n, &m);
for ( i = 0; i < n; i++ ) gets(fd[i]);
ans = 0;
for ( i = 0; i < n; i++ )
for ( j = 0; j < m; j++ )
if ( 'W' == fd[i][j] ) {//找到一处W后就进行DFS
//找出与之相连的最大的水洼区域
dfs( i, j );
ans++;
}
printf("%d\n", ans);
return 0;
}
无注释代码:
#include <stdio.h>
#define MAXLEN 100
char fd[MAXLEN][MAXLEN + 1];
int n, m;
void
dfs( int x, int y ) {
int dx, dy;
int xx, yy;
fd[x][y] = '.';
for ( dx = -1; dx <= 1; dx++ )
for ( dy = -1; dy <= 1; dy++ ) {
if ( !dx && !dy ) continue;
xx = x + dx;
yy = y + dy;
if ( xx >= 0 && xx < n && yy >= 0 && yy < m && 'W' == fd[xx][yy] )
dfs( xx, yy );
}
return ;
}
int
main() {
int i, j;
int ans;
scanf("%d%d\n", &n, &m);
for ( i = 0; i < n; i++ ) gets(fd[i]);
ans = 0;
for ( i = 0; i < n; i++ )
for ( j = 0; j < m; j++ )
if ( 'W' == fd[i][j] ) {
dfs( i, j );
ans++;
}
printf("%d\n", ans);
return 0;
}
单词解释:
diagram:n, 图表,图解
adjacent:adj, 临近的,毗连的
pond:n, 池塘
square:n, 平方,正方形
represent:vt, 描绘,代表