原帖地址http://bbs.csdn.net/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); } } }