原帖地址http://bbs.youkuaiyun.com/topics/380191378
之前写的代码有BUG,就是第一个点必须是1.呵呵,修改了一下。
原题
连通判定,图1为连通(从一个[1]可以到达任何一个[1])
图2为不连通(至少存在2个[1],他们之间无法到达)
图1:
1 1 1 1 1 1 1
1 1 1 1 0 0 1
1 1 1 1 0 0 1
1 1 0 0 1 1 1
1 1 0 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
图2:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 1 1 1 0 1
1 0 1 1 1 0 1
1 0 1 1 1 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
public class Demo1 {
static int a1[][] = {
{0 ,0 ,1 ,1 ,1 ,1 ,1}
,{1 ,0, 1, 0, 0, 0, 1}
,{1 ,0, 1, 1, 1, 0, 1}
,{1 ,0, 1, 1, 1, 0, 1}
,{1 ,0, 1, 1, 1, 0, 1}
,{1 ,0 ,0 ,0 ,0 ,0, 1}
,{1 ,1, 1, 1, 1, 1, 1}};
static int m = a1.length;//最大长度
static int n = a1[0].length;//最大宽度
/**
* @param args
*/
public static void main(String[] args) {
Demo1 ha = new Demo1();
boolean flag2 = false;
for (int i = 0; i < a1.length; i++) {
for (int j = 0; j < a1[i].length; j++) {
if(a1[i][j]==1){//找第一个点
int[][] list = {{i,j}};
a1[i][j]=2;
ha.check(list);
flag2 = true;
break;
}
}
if(flag2){
break;
}
}
// a1[0][0]=2;
// System.out.println(list3[0]);
boolean flag = true;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
System.out.print(a1[i][j]);
if(a1[i][j]==1)
{
flag = false;
}
}
System.out.println();
}
if(flag)
{
System.out.println("是开放的");
}
else
{
System.out.println("是闭合的");
}
}
/**
* 从第一点0,0开始,找他周围的8个点,
* 如果周围的8个点有1,则记录下来,
* 下次找这些1点的全部点,不断向外覆盖
* 被覆盖的1点往上加1,都变成2,0点不覆盖
* 当有一个点的周围8个点没有1存在时。
* 跳出循环,说明已经全部覆盖完了
* 最后循环矩阵,如果还存在1的点,
* 证明这个矩阵不是联通的,否则是联通的
* @param list
*/
public void check(int[][] list)
{
int[][] list1 = new int[100][];
int k=0;
for(int i=0;i<list.length;i++)
{
int[] zuobiao = list[i];
int x = zuobiao[0];//横坐标
int y = zuobiao[1];//纵坐标
/*
* 开始找周围8个点
* 的坐标
*/
int[][] eight = new int[8][2];//
//左上
if(x>0 && y>0)
{
eight[0][0] = x-1;
eight[0][1] = y-1;
if(a1[x-1][y-1] ==1)
{
a1[x-1][y-1] +=1;
list1[k] = eight[0];
k++;
}
}
//上
if(y>0)
{
eight[1][0] = x;
eight[1][1] = y-1;
if(a1[x][y-1] ==1)
{
a1[x][y-1] +=1;
list1[k] = eight[1];
k++;
}
}
//右上
if(x<m-1 && y>0)
{
eight[2][0] = x+1;
eight[2][1] = y-1;
if(a1[x+1][y-1] ==1)
{
a1[x+1][y-1] +=1;
list1[k] = eight[2];
k++;
}
}
//左
if(x>0)
{
eight[3][0] = x-1;
eight[3][1] = y;
if(a1[x-1][y] ==1)
{
a1[x-1][y] +=1;
list1[k] = eight[3];
k++;
}
}
//右
if(x<m-1)
{
eight[4][0] = x+1;
eight[4][1] = y;
if(a1[x+1][y] ==1)
{
a1[x+1][y] +=1;
list1[k] = eight[4];
k++;
}
}
//左下
if(x>0 && y<n-1)
{
eight[5][0] = x-1;
eight[5][1] = y+1;
if(a1[x-1][y+1] ==1)
{
a1[x-1][y+1] +=1;
list1[k] = eight[5];
k++;
}
}
//下
if(y<n-1)
{
eight[6][0] = x;
eight[6][1] = y+1;
if(a1[x][y+1] ==1)
{
a1[x][y+1] +=1;
list1[k] = eight[6];
k++;
}
}
//右下
if(x<m-1 && y<n-1)
{
eight[7][0] = x+1;
eight[7][1] = y+1;
if(a1[x+1][y+1] ==1)
{
a1[x+1][y+1] +=1;
list1[k] = eight[7];
k++;
}
}
}
//说明list1里没有点,说明覆盖完了
if(list1[0] == null)
{
return;
}else
{
int[][] list2 = null;
int i=0;
for(;i<list1.length;i++)
{
if(list1[i]==null)
{
list2 = new int[i][];
break;
}
}
for(int j=0;j<i;j++)
{
list2[j]= list1[j];
}
check(list2);
}
}
}