2014-06-11 88 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 

     } 
     }; 

} 


}