- 顺便训练自己的英语:
- 因为近期下雨,农家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 = 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); } } } }