POJ No.2386-Lake Counting(算水洼)

原创 2016年11月21日 09:47:24

POJ No.2386-Lake Counting(算水洼)

深度优先搜索:从最开始的状态出发,遍历所有可以到达的状态。由此可以对所有的状态进行操作,或者列举出所有的状态。

 

有一个大小为N*M的园子,雨后积起了水。八联通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八联通指的是下图中相对W的*的部分)

* * *

*W*

* * *

限制条件:N,M<=100

 

样例

N=10

M=12

W********WW*

*WWW*****WWW

****WW***WW*

*********WW*

*********W**

**W******W**

*W*W*****WW*

W*W*W*****W*

*W*W******W*

**W*********

3

import java.util.Scanner;

public class LakeCounting
{
	static int M, N;
	static String[] field = new String[100 + 10];

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin = new Scanner(System.in);
		System.out.print("N=");
		N = cin.nextInt();
		System.out.print("M=");
		M = cin.nextInt();
		for (int i = 0; i < N; i++)
			field[i] = cin.next();
		solve();
	}

	static void solve() {
		int res = 0;
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++)
				if (field[i].charAt(j) == 'W') {
					dfs(i, j);
					res++;
				}
		System.out.println(res);
	}

	static void dfs(int x, int y) {
		StringBuilder strBuilder = new StringBuilder(field[x]);
		strBuilder.setCharAt(y, '*');
		field[x]=strBuilder.toString();
		int dx;
		int dy;
		for (dx = -1; dx <= 1; dx++)
			for (dy = -1; dy <= 1; dy++) {
				int nx = x + dx;
				int ny = y + dy;
				if (0 <= nx && nx < N && 0 <= ny && ny < M && field[nx].charAt(ny) == 'W')
					dfs(nx, ny);
			}
	}
}

从任意的W开始,不停地把邻接的部分用‘*’替代。一次DFS后与初始的这个W连接的所有W就都被替换成了‘*’,因此直到图中不再存在为止,总共进行DFS的次数就是答案。8个方向共对应了8种状态转移,每个格子作为DFS的参数至多被调用一次,所以复杂度为O(8*N*M)=O(N*M)。



版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ NO.2386 Lake Counting(算水洼)

问题描述:题意:给你一个row*col的矩阵表示一块田地,上面的'W'代表积水,'.'表示干地,问这块田地里面的积水能汇聚成几片水洼。 题目链接:点击打开链接 思路:从任意的‘W’开始,不停地把邻接的...
  • quper1g
  • quper1g
  • 2016年01月19日 17:24
  • 870

Lake Counting(DFS) POJ No.2386

有一个大小为n*m的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对w的*的部分) *** *w* *** 限制条件:n,m 思路:...
  • Alex_X_Jane
  • Alex_X_Jane
  • 2015年12月21日 22:55
  • 362

水洼

/*有一个大小为N*M的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请 求出园子里总共有多少水洼 (八连通指的是下图中相对W的*部分) *** *W* *** 输入 10 12 W....
  • zhulingyan1018
  • zhulingyan1018
  • 2016年03月30日 16:50
  • 331

编程算法 - 水洼的数量 代码(C)

水洼的数量 代码(C)本文地址: http://blog.csdn.net/caroline_wendy题目: 有一个大小为N*M的园子, 雨后起了积水. 八连通的积水被认为是连接在一起的. 请求出园...
  • u012515223
  • u012515223
  • 2014年07月17日 14:21
  • 2403

POJ No.2386(Lake Counting)

Description Due to recent rains, water has pooled in various places in Farmer John's field, which...
  • qq_36501295
  • qq_36501295
  • 2017年09月16日 10:44
  • 49

POJ No.2386-Lake Counting(算水洼)

POJ No.2386-Lake Counting(算水洼) 深度优先搜索:从最开始的状态出发,遍历所有可以到达的状态。由此可以对所有的状态进行操作,或者列举出所有的状态。 有一个大小为...
  • qq_36683953
  • qq_36683953
  • 2016年11月21日 09:47
  • 346

水洼 POJ2386 挑战程序设计竞赛

1.题目原文 http://poj.org/problem?id=2386 Lake Counting Time Limit: 1000MS   Memory Limit: 65536K...
  • qq_33929112
  • qq_33929112
  • 2016年09月22日 20:32
  • 488

POJ2282:The Counting Problem(数位DP)

Description Given two integers a and b, we write the numbers between a and b, inclusive, in a list. ...
  • libin56842
  • libin56842
  • 2013年08月16日 15:56
  • 2231

POJ-2386-Lake Counting-解题报告

跟“红与黑”那道题很相似,都是用递归思想解决。 这道也是自己独立解答出来的,一次就AC了,很有些成就感啊。    #include using namespace std; const i...
  • lihao21
  • lihao21
  • 2011年01月22日 19:02
  • 3053

POJ 2386 Lake counting

本题链接可在poj 中根据题号找到 基本思路:通过深度优先遍历的方法找出所有八连通的点,即如果有一点是水,那么周围是水的点应该按深度优先遍历,并置为‘.’。按照上述的过程一直遍历,那么相连通的水集合...
  • u010232171
  • u010232171
  • 2014年12月06日 16:10
  • 179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ No.2386-Lake Counting(算水洼)
举报原因:
原因补充:

(最多只允许输入30个字)