在2D数组中查找封闭区域

时间:2014-06-11 17:18:23

标签: java arrays 2d

因此,我在“处理”中对游戏进行编程,其中角色在4个方向上移动,无论在何处移动,它都将其坐标存储在500x700维度的2D数组中。

如果角色按照说法移动到坐标(5,10),则数组[5] [10]将设置为1.否则为0。

我想要找到的是这个数组中的矩形封闭区域。我怎么会继续这样做呢?我不知道,我已经通过反复试验尝试了所有内容,但有人可以帮助我吗?提前谢谢!

编辑****

所以,让我说我有一个10x10的二维数组:

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时,搜索长度和高度,并确定是否存在于另一侧,位置相同的长度&# 34; N"远。这样做是否合适?什么是更有效的解决方案?

1 个答案:

答案 0 :(得分: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

        }
        };

}


}