问大家个算法问题, 难到我好几天了...

龙翔飞雪 2016-05-10 11:09:08
二维数组 [20, 20] (其实数组大小无所谓) , 值只有0和1.
如下
0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

大家有没有看到1组成了一个闭合的环, 写一个算法, 把闭环内的0全部改成2.
请教了, 谢谢~~~~
...全文
621 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙翔飞雪 2016-05-12
  • 打赏
  • 举报
回复
@tangxheng 谢谢你的实现; 使用递归会遇到问题, 就是处理我这边300*300数组的时候, 会StackOverflowError, 我改成了LinkedList循环, 解决了. 结贴
  • 打赏
  • 举报
回复
这么肤浅的问题。 我只是来看看谁的算法最高明
  • 打赏
  • 举报
回复
引用 5 楼 rickylin86 的回复:

public class Test{
	public static void main(String[] args){
		String content = 
		"0  0  0  0  0  0  0  0  0  1  1  0  0  0  0  0  0  0  0  0" + "\n" +
		"0  0  0  0  0  0  0  1  1  1  1  1  1  0  0  0  0  0  0  0" + "\n" +
		"0  0  0  0  1  1  1  0  0  0  0  0  0  1  1  1  0  0  0  0" + "\n" +
		"0  0  0  1  1  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0" + "\n" +
		"0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0" + "\n" +
		"0  0  1  1  0  0  0  0  0  0  0  0  0  0  1  1  0  0  0  0" + "\n" +
		"0  0  1  1  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0" + "\n" +
		"0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  1  1  0  0  0" + "\n" +
		"0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  1  1  0  0  0" + "\n" +
		"0  0  1  1  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0" + "\n" +
		"0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0" + "\n" +
		"0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  1  1  0  0  0" + "\n" +
		"0  0  0  1  1  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0" + "\n" +
		"0  0  0  0  1  1  0  0  0  0  0  0  0  0  1  0  0  0  0  0" + "\n" +
		"0  0  0  0  0  1  0  0  0  0  0  0  0  0  1  0  0  0  0  0" + "\n" +
		"0  0  0  0  0  1  1  1  1  1  1  1  1  1  1  0  0  0  0  0" + "\n" +
		"0  0  0  0  0  1  0  0  0  1  1  1  1  0  0  0  0  0  0  0" + "\n" +
		"0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0" + "\n" +
		"0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0" + "\n" +
		"0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0";
		System.out.println(content);
		System.out.println("------------------------------------------------------");
		int length = content.length();
		content = content.replaceAll("(?m)(?<=1.{0," + length + "})0(?=.*1)","2");
		System.out.println(content);
	}
}
这个好,典型的vimer我喜欢,,
piaopiao11 2016-05-11
  • 打赏
  • 举报
回复
可以试试这个代码,只要环上面开一个口,外面的就会慢慢渗透进去。
piaopiao11 2016-05-11
  • 打赏
  • 举报
回复
我这也有一个办法,应该叫做感染法吧。 首先把最边上的数当做病毒,所有可以接触到病毒的0,都被感染,然后递归去做,一直到不能继续感染为止,剩下的0就是闭环内的。
piaopiao11 2016-05-11
  • 打赏
  • 举报
回复
public class T {

	 private static final int nums[][] = {
         {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
         {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
         {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
         {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
         {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
         {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
         {0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
         {0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
         {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
         {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
         {0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
         {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
 };

		public static void main(String[] args) throws Exception { 
			init();
			b();	
			c();
			print();
		}
	 
	 

	public static   void init(){
		for(int i=0;i<nums.length;i++){
			for(int j=0;j<nums[i].length;j++){
				if(i==0||i==nums.length-1||j==0||j==nums[i].length-1){
					nums[i][j]=9;
				}
			}
		}
	}
	
	public static void b(){//
		int flag=0;
		for(int i=1;i<nums.length-1;i++){
			for(int j=1;j<nums[i].length-1;j++){
				if(nums[i][j]==0&&(nums[i][j-1]==9||nums[i-1][j]==9||nums[i][j+1]==9||nums[i+1][j]==9)){
					nums[i][j]=9;
					flag=1;
				}
			}
		}
		if(flag==1){
			System.out.println("do--");
//			print();
			b();
		}
	}
	
	public static void c(){
		for(int i=0;i<nums.length;i++){
			for(int j=0;j<nums[i].length;j++){
				if(nums[i][j]==0){
					nums[i][j]=2;
				}
				if(nums[i][j]==9){
					nums[i][j]=0;
				}
			}
		}
	}
	
	public  static void print(){
		for (int[] num : nums) {
			System.out.println(Arrays.toString(num));
		}
	}
	

}
?????983 2016-05-11
  • 打赏
  • 举报
回复
也就是说判断0的上下左右是否为0如果是把他放进一个数组,最后会返回两个数组,一个是闭合环数组一个是非闭合环数组
家里敷泥呀 2016-05-11
  • 打赏
  • 举报
回复
引用 11 楼 sozdream 的回复:
@Mingyueyixi 谢谢你的耐心的回复, 不过正如你所说, 我处理的情况, 要比这里举得例子复杂的多 (是300*300的数组, 由图片得来的) 这个数组里, 各种情况都可能.....(有开口的环, 有n个环, 游离的1等等) 目前我有点思路了, 算法的思路是: 把二维数组想象成一个长方形的水塘, 0是平静的水, 1是假山. 在水塘里丢一块石子会产生水波涟漪. 涟漪会扩散到水塘的边缘或假山. (涟漪的扩散是个递归函数) 如果石子丢在[0,0]位置, 它产生的涟漪会扩散到整个闭环的外部和水塘的边缘. 如果石子丢在闭合环内部呢? 涟漪只能扩散满闭环, 而不能扩散至水塘的边缘. 如果石子丢在假山上呢? 当然就没产生涟漪. 如果本帖里的环有个口子呢? 那么涟漪就会从这个口子扩散出去至边缘. (好像是物理的波动衍射现象?) 那么结论就是, 能造成涟漪扩散至边缘的点, 就是闭环外的点; 能造成涟漪不能扩散至边缘的点, 是闭环内的点. 等我实现看看, 就来结贴哈~~~~
思路很好,补充一个情况,有没有可能存在多闭环的图形。
?????983 2016-05-11
  • 打赏
  • 举报
回复
遍历每一个1,判断他是不是树形结构,如果是树形结构就不是闭合环
龙翔飞雪 2016-05-11
  • 打赏
  • 举报
回复
@Mingyueyixi 谢谢你的耐心的回复, 不过正如你所说, 我处理的情况, 要比这里举得例子复杂的多 (是300*300的数组, 由图片得来的) 这个数组里, 各种情况都可能.....(有开口的环, 有n个环, 游离的1等等) 目前我有点思路了, 算法的思路是: 把二维数组想象成一个长方形的水塘, 0是平静的水, 1是假山. 在水塘里丢一块石子会产生水波涟漪. 涟漪会扩散到水塘的边缘或假山. (涟漪的扩散是个递归函数) 如果石子丢在[0,0]位置, 它产生的涟漪会扩散到整个闭环的外部和水塘的边缘. 如果石子丢在闭合环内部呢? 涟漪只能扩散满闭环, 而不能扩散至水塘的边缘. 如果石子丢在假山上呢? 当然就没产生涟漪. 如果本帖里的环有个口子呢? 那么涟漪就会从这个口子扩散出去至边缘. (好像是物理的波动衍射现象?) 那么结论就是, 能造成涟漪扩散至边缘的点, 就是闭环外的点; 能造成涟漪不能扩散至边缘的点, 是闭环内的点. 等我实现看看, 就来结贴哈~~~~
bree06 2016-05-11
  • 打赏
  • 举报
回复
引用 27 楼 tangxheng 的回复:
完全没压力
当你测试static int[][] box = new int[300][300]; 的时候你就知道压力在哪儿了
piaopiao11 2016-05-11
  • 打赏
  • 举报
回复
额,你的这个没问题。 to bree06 他的那个在数据复杂的时候有bug。
tangxheng 2016-05-11
  • 打赏
  • 举报
回复
完全没压力
================未感染的超人来了(2)===============
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0]
[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
[0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0]
[0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0]
[0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
piaopiao11 2016-05-11
  • 打赏
  • 举报
回复
引用 21 楼 bree06 的回复:
我写了一个很奇怪的方法...
你试试这个
  public static int[][] box = {
            { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
            { 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1 },
            { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0 },
            { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
            { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
            { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
            { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
            { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0 },
            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0 },
            { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
            { 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
            { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
            { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
tangxheng 2016-05-11
  • 打赏
  • 举报
回复
好像不公整,格试调下
package dmiaes.client.view;

import java.util.Arrays;

public class T {

	private static final int nums[][] = {
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
			{ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
			{ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 },
			{ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
			{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
			{ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
			{ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
			{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },
			{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
			{ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
			{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
			{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
			{ 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
			{ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
			{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
			{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
			{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };

	public static void main(String[] args) throws Exception {
		// 投放感染源
		toufang();

		// 打印结果
		print();
	}

	/**
	 * 投放感染源,将会围绕二维数据边缘投放一圈
	 */
	private static void toufang() {
		// 最上面一排投放感染源,向下方感染
		for (int i = 0; i < nums[0].length; i++) {
			ganran(0, i);
		}

		// 最左边一列投放感染源,向右方感染
		for (int i = 0; i < nums.length; i++) {
			ganran(i, 0);
		}

		// 最下面一排投放感染源,向上方感染
		for (int i = 0; i < nums[0].length; i++) {
			ganran(nums.length - 1, i);
		}

		// 最右边一列投放感染源,向左方感染
		for (int i = 0; i < nums.length; i++) {
			ganran(i, nums[i].length - 1);
		}
	}

	/**
	 * 感染函数, 即投放感染源坐标,被感染值改为9
	 * 
	 * @param x
	 *            感染源横坐标
	 * @param y
	 *            感染源纵坐标
	 */
	private static void ganran(int x, int y) {
		//超过数组边缘,不再感染
		if (x < 0 || y < 0 || x > nums.length - 1 || y > nums[x].length - 1) {
			return;
		}

		// 本源不可被感染
		if (nums[x][y] != 0) {
			return;
		}
		// 本源可被感染,被感染值改为9
		nums[x][y] = 9;

		// 向左感染
		ganran(x - 1, y);

		// 向上感染
		ganran(x, y - 1);

		// 向右感染
		ganran(x + 1, y);

		// 向下感染
		ganran(x, y + 1);
	}

	public static void print() {
		// 打印感染情况
		for (int[] num : nums) {
			System.out.println(Arrays.toString(num));
		}

		System.out.println("================被感染的人群来了(9)===============");
		// 还源感染,并将未感染人群设置为超人
		for (int i = 0; i < nums.length; i++) {
			for (int j = 0; j < nums[i].length; j++) {
				switch (nums[i][j]) {
				case 9:
					nums[i][j] = 0;
					break;
				case 0:
					nums[i][j] = 2;
					break;
				default:
					break;
				}

			}
		}

		System.out.println("================未感染的超人来了(2)===============");
		// 打印超人感染情况
		for (int[] num : nums) {
			System.out.println(Arrays.toString(num));
		}
	}
}
tangxheng 2016-05-11
  • 打赏
  • 举报
回复
package dmiaes.client.view; import java.util.Arrays; public class T { private static final int nums[][] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, { 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; public static void main(String[] args) throws Exception { // 投放感染源 toufang(); // 打印结果 print(); } /** * 投放感染源,将会围绕二维数据边缘投放一圈 */ private static void toufang() { // 最上面一排投放感染源,向下方感染 for (int i = 0; i < nums[0].length; i++) { ganran(0, i); } // 最左边一列投放感染源,向右方感染 for (int i = 0; i < nums.length; i++) { ganran(i, 0); } // 最下面一排投放感染源,向上方感染 for (int i = 0; i < nums[0].length; i++) { ganran(nums.length - 1, i); } // 最右边一列投放感染源,向左方感染 for (int i = 0; i < nums.length; i++) { ganran(i, nums[i].length - 1); } } /** * 感染函数, 即投放感染源坐标,被感染值改为9 * * @param x * 感染源横坐标 * @param y * 感染源纵坐标 */ private static void ganran(int x, int y) { //超过数组边缘,不再感染 if (x < 0 || y < 0 || x > nums.length - 1 || y > nums[x].length - 1) { return; } // 本源不可被感染 if (nums[x][y] != 0) { return; } // 本源可被感染,被感染值改为9 nums[x][y] = 9; // 向左感染 ganran(x - 1, y); // 向上感染 ganran(x, y - 1); // 向右感染 ganran(x + 1, y); // 向下感染 ganran(x, y + 1); } public static void print() { // 打印感染情况 for (int[] num : nums) { System.out.println(Arrays.toString(num)); } System.out.println("================被感染的人群来了(9)==============="); // 还源感染,并将未感染人群设置为超人 for (int i = 0; i < nums.length; i++) { for (int j = 0; j < nums[i].length; j++) { switch (nums[i][j]) { case 9: nums[i][j] = 0; break; case 0: nums[i][j] = 2; break; default: break; } } } System.out.println("================未感染的超人来了(2)==============="); // 打印超人感染情况 for (int[] num : nums) { System.out.println(Arrays.toString(num)); } } } //借大家的理解,实现的,支持非对称数组哦,逻辑简单好理解
piaopiao11 2016-05-11
  • 打赏
  • 举报
回复
改进了一下 之前边上的1没判定。另外多加了几次循环,加快处理速度。
public class T {

	 private static  int nums[][] 
			 = {
         { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
         { 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1 },
         { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0 },
         { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
         { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
         { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
         { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
         { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
         { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
         { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
         { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
         { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
         { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
         { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
         { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
         { 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
         { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
         { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
         { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };

		public static void main(String[] args) throws Exception { 
			init();
			b();	
			c();
			print();
		}
	 

	public static   void init(){
		for(int i=0;i<nums.length;i++){
			for(int j=0;j<nums[i].length;j++){
				if(nums[i][j]==0&&(i==0||i==nums.length-1||j==0||j==nums[i].length-1)){
					nums[i][j]=9;
				}
			}
		}
	}
	
	public static void b(){
		int flag=0;
		for(int i=1;i<nums.length-1;i++){
			for(int j=1;j<nums[i].length-1;j++){
				if(ex(i, j))flag=1;
			}
			for(int j=nums[i].length-2;j>1;j--){
				if(ex(i, j))flag=1;
			}
		}
		for(int i=nums.length-2;i>1;i--){
			for(int j=1;j<nums[i].length-1;j++){
				if(ex(i, j))flag=1;
			}
			for(int j=nums[i].length-2;j>1;j--){
				if(ex(i, j))flag=1;
			}
		}
		if(flag==1){
//			print();
			System.out.println("re do--");
			b();
		}
	}
	private static boolean ex(int i,int j){
		if(nums[i][j]==0&&(nums[i][j-1]==9||nums[i-1][j]==9||nums[i][j+1]==9||nums[i+1][j]==9)){
			nums[i][j]=9;
			return true;
		}
		return false;
	}
	
	
	
	public static void c(){
		for(int i=0;i<nums.length;i++){
			for(int j=0;j<nums[i].length;j++){
				if(nums[i][j]==0){
					nums[i][j]=2;
				}
				if(nums[i][j]==9){
					nums[i][j]=0;
				}
			}
		}
	}
	
	public  static void print(){
		for (int[] num : nums) {
			System.out.println(Arrays.toString(num));
		}
	}
	

}
bree06 2016-05-11
  • 打赏
  • 举报
回复
我写了一个很奇怪的方法...
public
class Demo39 {
    static int[][] box = {
            { 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
            { 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1 },
            { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0 },
            { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
            { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
            { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
            { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
            { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
            { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },// 这里有一个缺口
            { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 },
            { 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
            { 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
            { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
//    static int[][] box = new int[300][300]; // 测试300x300的最坏情况
    final static int x = box.length, y = box[0].length;

    public static void main(String[] args) {
        mark();
        print();
    }

    static void print() {
        for (int i = 0; i < x; i++) {
            System.out.println(Arrays.toString(box[i]));
        }
    }

    static void mark() {
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if ((box[i][j] | 0) == 0) {
                    box[i][j] = 2;
                }
            }
        }
        out: for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (box[i][j] == 2) {
                    box[i][j] = 0;
                } else if (box[i][j] == 1) {
                    continue out;
                }
            }
        }
        out: for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (box[j][i] == 2) {
                    box[j][i] = 0;
                } else if (box[j][i] == 1) {
                    continue out;
                }
            }
        }
        out: for (int i = 0; i < x; i++) {
            for (int j = 1; j < y; j++) {
                if (box[i][y - j] == 2) {
                    box[i][y - j] = 0;
                } else if (box[i][y - j] == 1) {
                    continue out;
                }
            }
        }
        out: for (int i = 0; i < y; i++) {
            for (int j = 1; j < x; j++) {
                if (box[x - j][i] == 2) {
                    box[x - j][i] = 0;
                } else if (box[x - j][i] == 1) {
                    continue out;
                }
            }
        }
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (box[i][j] == 2 && zero_right(i, j)) {
                    box[i][j] = 0;
                }
            }
        }
        for (int i = 0; i < x; i++) {
            for (int j = 1; j < y; j++) {
                if (box[i][x - j] == 2 && zero_right(i, x - j)) {
                    box[i][x - j] = 0;
                }
            }
        }
        for (int i = 1; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (box[x - i][j] == 2 && zero_right(x - i, j)) {
                    box[x - i][j] = 0;
                }
            }
        }
        for (int i = 1; i < x; i++) {
            for (int j = 1; j < y; j++) {
                if (box[x - i][x - j] == 2 && zero_right(x - i, x - j)) {
                    box[x - i][x - j] = 0;
                }
            }
        }
    }

    static boolean zero_right(int x, int y) {
        return (box[x - 1][y] == 0 || box[x][y - 1] == 0 || box[x][y + 1] == 0 || box[x + 1][y] == 0);
    }
}
bree06 2016-05-11
  • 打赏
  • 举报
回复
引用 17 楼 piaopiao11 的回复:
可以试试这个代码,只要环上面开一个口,外面的就会慢慢渗透进去。
	 static int nums[][] = {
	 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
	 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
	 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
	 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
拿这个试试看效果
龙翔飞雪 2016-05-11
  • 打赏
  • 举报
回复
引用 15 楼 piaopiao11 的回复:
我这也有一个办法,应该叫做感染法吧。 首先把最边上的数当做病毒,所有可以接触到病毒的0,都被感染,然后递归去做,一直到不能继续感染为止,剩下的0就是闭环内的。
嗯, 病毒感染和水波涟漪是一个意思.
加载更多回复(11)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧