POJ 2386 Lake Counting

题目大意:

        由于最近的阴雨天,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, 描绘,代表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值