2014-06-11 47 views
-3

因此,我正在处理一个角色在四个方向上移动的游戏,并且无论它移动到何处,都会将其坐标存储在500x700维度上的二维数组中。查找二维数组中的封闭区域

如果字符移动到每坐标(5,10)的发言权,则阵列[5] [10]将被设置为1,否则为0。

我想找到是一个矩形封闭的区域在这个数组中。我怎么会继续这样做呢?我不知道,我试过所有的试验和错误,但有人可以帮我吗?先谢谢你!

编辑****

所以我们可以说我有10×10的二维数组:

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 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 0 0 0 0 0 0 0 0 0 
0 1 1 1 1 1 1 0 0 0 
0 1 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 1 0 0 0 
0 1 0 0 0 0 1 0 0 0 
0 1 1 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 

1的,从[1] [1]应该被检测为区域42 6的矩形宽度开始和7在长度。

我试过的是用for循环遍历数组,然后每当有1时,搜索长度和高度,并确定是否存在于另一边,在位置“n”处的长度相同,远。这是否适合这样做?什么是更有效的解决方案?

+5

请发表你已经尝试什么,为什么你认为它会失败。另外,你的意思是什么*矩形封闭区*? – Christian

+0

这个数组是如何设置的?每一行都是一个子数组? – Bryan

+0

@Bryan:这是一个2D数组。所以基本上你是对的。 – Stevantti

回答

0

尝试了这一点:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Scanner; 
public class test { 
public static void main(String[] args) { 

    Integer[][] intArray = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
         {0, 1, 1, 1, 1, 1, 1, 0, 0, 0}, 
         {0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, 
         {0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, 
         {0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, 
         {0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, 
         {0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, 
         {0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, 
         {0, 1, 0, 0, 0, 0, 1, 0, 0, 0}, 
         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
         {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; 

    int highestFreq = 0; 
    List<Integer> freqList = new ArrayList<Integer>(); 
    for(Integer[] intArrays : intArray){ 
     List<Integer> arrays = Arrays.asList(intArrays); 
     int freq = Collections.frequency(arrays, 1); 
     if(freq > highestFreq){ 
      highestFreq = freq; 
     } 

     if(freq > 0){ 
      freqList.add(freq); 
     } 

    } 

    Integer count = 0; 
    for(Integer ints : freqList.subList(1, freqList.size()-1)){ 

     if(ints.equals(freqList.get(1))){ 
       count += 1; 
     } 

     if(count == freqList.size() - 2){ 

      System.out.println(highestFreq * freqList.size()); 
        //prints 48 

     } 
     }; 

} 


}