Fork me on GitHub

2386.LAKE COUNTING 湖泊计数--BFS

顺便训练自己的英语:
因为近期下雨,农家John 的农场有很多水坑(用一个NM矩阵表示| represent 代表、rectangle 矩阵),每一个区域表示形式为水(w)或者土地(.),农夫jhon 想指出在他的农村多少个已经形成的水坑,一个水坑是由一个水和连接在一起的八个邻居区域形成的
给一个农场的示意图(diagram 示意图 图示),推测有多少个水坑(square 正方形)
输入:
第一行两个数 N 和M
第二行M 个字符一行
输出:
数量
百度翻译
由于最近的降雨,水聚集在农民约翰农场的各个地方,由一个n x m(1<=n<=100;1<=m<=100)的矩形表示。每个广场都有水(“W”)或旱地(“.”)。农夫约翰想知道他田里形成了多少池塘。池塘是一组相连的正方形,其中有水,一个正方形被认为是邻近八个邻居。给一张农夫约翰田地的图表,确定他有多少池塘。

解法一:

import java.util.Scanner;
public class Main {
	static char[][] c;
	static boolean flag[][];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int N = sc.nextInt();
			int M = sc.nextInt();	
			c = new char[N][M];									//赋值
			flag = new boolean[c.length][c[0].length];			//赋值
			for (int i = 0; i < N; i++) {
				String s = sc.next();
				c[i] = s.toCharArray();							//赋值
				for (int j = 0; j < M; j++) {
					flag[i][j] = false;							//初始化
				}
			}
			int s = 0;
			for (int i = 0; i < c.length; i++) {
				for (int j = 0; j < c[0].length; j++) {
					if (flag[i][j] != true) {					//如果这个值没有被读过
//						flag[i][j] = true;		多余的 因为下面函数会再次赋值 如果在这里赋值会导致每个值不能通过				//赋值已读状态
						if (c[i][j] == 'W') {					//如果是w 即进行深度遍历
							dfs(c, i, j, flag);					//满足条件都赋值
							s++;
						}
					}
				}
			}
			System.out.println(s);
		}
	}
	public static void dfs(char[][] arr, int x, int y, boolean[][] temp) {
		if (x < 0 || x >= c.length || y >= c[0].length || y < 0)				//超出范围就跳出
			return;
		if (temp[x][y] == true) 												// 说明已经访问了
			return;
		if (arr[x][y] == '.') {													//为.即不满足条件
			temp[x][y] = true;													//并赋予已读状态
			return;
		}
		temp[x][y] = true;														//留下来的都是未读w
		dfs(arr, x, y + 1, temp);											    // 把周围符合条件的位置遍历赋值true
		dfs(arr, x, y - 1, temp);
		dfs(arr, x + 1, y, temp);
		dfs(arr, x + 1, y + 1, temp);
		dfs(arr, x + 1, y - 1, temp);
		dfs(arr, x - 1, y, temp);
		dfs(arr, x - 1, y + 1, temp);
		dfs(arr, x - 1, y - 1, temp);
	}
}

解法二:
直接将 W 改为 . !!!以表示已读

import java.util.Scanner;
public class Main {
	static char[][] field;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int N = sc.nextInt();
			int M = sc.nextInt();
			field = new char[N][M]; // 赋值
			for (int i = 0; i < N; i++) {
				String s = sc.next();
				field[i] = s.toCharArray(); // 赋值
			}
			int s = 0;
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < M; j++) {
					if (field[i][j] == 'W') {
						dfs(i, j, N, M);
						s++;
					}
				}
			}
			System.out.println(s);
		}
	}
	public static void dfs(int x, int y, int N, int M) {
		field[x][y] = '.';
		for (int i = -1; i < 2; i++) {
			for (int j = -1; j < 2; j++) {
				int nx = x + i;
				int ny = y + j;
				if (0 <= nx && nx < N && 0 <= ny && ny < M && field[nx][ny] == 'W')
					dfs(nx, ny, N, M);
			}
		}
	}
}
posted @ 2019-07-07 21:56  cznczai  阅读(338)  评论(0编辑  收藏  举报