您的位置:首页 > 其它

HDU1198(Farm Irrigation)-并查集

2012-08-15 17:44 225 查看
题目链接: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]
;
}
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);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: