HDU1198(Farm Irrigation)-并查集

来源:互联网 发布:淘宝退货率怎么计算 编辑:程序博客网 时间:2024/06/06 03:56

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198

 

package D0815;/* * 给定一些土地的样板,要你求需要的最少的水泵的数目。 * 思路:并查集 * 将土地信息存在二维数组中,遍历,判断每块土地的右边和下边的一块土地的 * 样子,如果符合条件,合并集合 * 要想合并集合,必须满足 * 当前土地:B||D||F||G||I||J||K * 右边土地:A||C||F||G||H||I||K *  * 当前土地:C||D||E||H||I||J||K * 下一土地:A||B||E||G||H||J||K * 注意:最后一行只需要判断右边的土地,最后一列只需要判断下面的土地 * */import java.util.*;public class HDU1198 {static char[][]map;static int wellsprings;static int m,n;static int[]set;static int[]height;public static void init(int k){set = new int[k];height = new int[k];for(int i = 0;i<k;i++){set[i] = i;height[i] = 1;}map = new char[m][n];}public static int find(int x){while(x!=set[x])x = set[x];return x;}public static void merge(int a,int b){a = find(a);b = find(b);if(a!=b){if(height[a]>height[b])set[b] = a;else if(height[a]<height[b])set[a] = b;else{set[b] = a;height[a]++;}}}public static void sove(){for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (i != m - 1) {// 不是最后一行,判断该土地的下面一块土地,if ((map[i][j] == 'C' || map[i][j] == 'D'|| map[i][j] == 'E' || map[i][j] == 'H'|| map[i][j] == 'I' || map[i][j] == 'J' || map[i][j] == 'K')&& (map[i + 1][j] == 'A' || map[i + 1][j] == 'B'|| map[i + 1][j] == 'E'|| map[i + 1][j] == 'G'|| map[i + 1][j] == 'H'|| map[i + 1][j] == 'J' || map[i + 1][j] == 'K')) {merge(i*n+j,(i+1)*n+j);}}if(j!=n-1){// 不是最后一列,判断该土地的右边一块土地if ((map[i][j] == 'B' || map[i][j] == 'D'|| map[i][j] == 'F' || map[i][j] == 'G'|| map[i][j] == 'I' || map[i][j] == 'J' || map[i][j] == 'K')&& (map[i][j + 1] == 'A' || map[i][j + 1] == 'C'|| map[i][j + 1] == 'F'|| map[i][j + 1] == 'G'|| map[i][j + 1] == 'H'|| map[i][j + 1] == 'I' || map[i][j + 1] == 'K')) {merge(i*n+j,i*n+j+1);}}}}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str;while(sc.hasNext()){m = sc.nextInt();n = sc.nextInt();if(m<0||n<0)break;wellsprings = m*n;//初始化数组init(m*n);for(int i = 0;i<m;i++){str = sc.next();//将str转化成字符数组char[] ch = str.toCharArray();for(int j = 0;j<n;j++){map[i][j]= ch[j];}}sove();int sum = 0;for(int i = 0;i< m*n;i++){if(i==set[i])sum++;}System.out.println(sum);}}}


 

原创粉丝点击