连通问题

package 搜索;


import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;


import javax.imageio.ImageIO;


public class 连通问题 {
static class Point {
public boolean isVisited = false;// 是否被访问,默认没访问
public boolean value = false;// 是否是黑色,默认白色
}


public static Point[][] p;// 像素数组
public static int width;// 像素宽
public static int height;// 像素高
public static int result;// 统计面积
public static int count;// 统计的总个数


public static void main(String[] args) throws IOException {
// 1:获取图片流
BufferedImage read = ImageIO.read(new File("t1.bmp"));
width = read.getWidth();
height = read.getHeight();
// 2:存储每一个坐标
p = new Point[width][height];
// 3:坐标数组填值,
for (int i = 0; i < width; i++) {
for (int k = 0; k < height; k++) {
p[i][k] = new Point();
if (read.getRGB(i, k) != -1) {// 非白色,则true
p[i][k].value = true;
}
}
}
// 4:输出每个连通群体的面积:就是它含有的像素的个数。
for (int x = 0; x < width; x++)
for (int y = 0; y < height; y++) {
result = 0;
scanImage(x, y);// 扫描图片
if (result == 0) {// 无结果,且全部扫描过
if (count == height * width) {
break;
}
} else {
System.out.println(result);
}
}


}


/**
* 扫描图片

* @param x
* @param y
*/
private static void scanImage(int x, int y) {
/*
* 1:防止越界
*/
if (x < 0 || y < 0 || x >= width || y >= height) {
return;
}
/*
* 2:扫描:两个点距离如果小于2个像素,则认为这两个点连通。
*/
if (!p[x][y].isVisited) {
p[x][y].isVisited = true;
count++;
if (p[x][y].value) {
result++;
scanImage(x, y - 1);
scanImage(x, y + 1);
scanImage(x - 1, y);
scanImage(x - 1, y + 1);
scanImage(x - 1, y - 1);
scanImage(x + 1, y);
scanImage(x + 1, y + 1);
scanImage(x + 1, y - 1);
}


}


}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值