多年前遇到的一道题,留个纪念

原帖地址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);
			}
		}

}


已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页