zoukankan      html  css  js  c++  java
  • 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);
    			}
    		}
    	}
    }
    
  • 相关阅读:
    博客园 投放 谷歌广告(google adsense) 且不被屏蔽掉
    JAVA与C#程序调用DOS命令
    redhat 5 安装apache 2.2
    解决"Windows 安装程序不允许从远程桌面连接安装"
    测试使用windows live writer的adsense coder发布文章
    解决:apache 整合redmine 启动报错 mod_passenger.so: failed to map segment from shared object: Permission denied
    企业级安全服务权限控制 Acegi安装系统介绍 Spring Framework安全系统
    解决Rails升级问题
    解决MyEclipse 7开发EXTJS 每次保存都要编译js的导致开发效率很低的问题
    解决:redmine 安装 rake db:migrate encoding: utf8
  • 原文地址:https://www.cnblogs.com/cznczai/p/11148086.html
Copyright © 2011-2022 走看看