2012-10-15 25 views
0

「在Java中編寫方法,如果在花紋板(二維數組)的同一行,列或對角線中存在k個相鄰符號,則返回true,其中k是所需的內嵌符號數。 「如何檢測數組中的相鄰條目?

我怎樣才能做到這一點?我對如何檢查行和列(粗糙;沒有代碼,只是想法)有一個粗略的想法,但是我在檢查對角線時不知所措。

編輯:我正在考慮的另一種情況:如何檢查任意位置?現在,我只考慮從(0,0)開始的事件,但是如果從(2,3)到(2,6)有3個字符串?我怎樣才能跟蹤多次事件?

編輯:探測左對角線(粗碼的問題,我貼在下面的意見):

LeftDiagonal(x, symbol) { 
    noOfOccurence = 0; 

    for (currentX = (size - 1); currentX >= x; currentX--) { 
     if (board[currentX][currentX] == symbol) { 
      noOfOccurence++; 
     } else { 
      break; 
     } 
    } 

    return (noOfOccurence >= k); 
} 
+0

'twoDimArray [0] [0]'緊挨着'twoDimArray [0] [1]'和'twoDimArray [1] [0]'和'twoDimArray [1] [1]'。還有什麼你需要的?順便說一下,這裏有一個模式:'twoDimArray [x] [y]','twoDimArray [x] [y + 1]','twoDimArray [x + 1] [y]','twoDimArray [x + 1 ] [Y + 1]'。 –

+0

對於任何位置元組(x,y),對角線僅僅是(x + 1,y + 1)。如果您對特定問題有任何疑問,請鼓勵編輯您提出的問題 - 根據問題的性質,根據需要提供代碼。 – Makoto

+0

您應該先編寫用於檢查行的代碼。讓它工作。然後轉到列。一旦你得到這兩個工作,對角線應該是相當明顯的。 –

回答

1

想到的最簡單的(雖然不是最有效的,因爲它可能會原路返回)解決方案寫一個遞歸函數,如下面的僞代碼

FindAdjacent(x, y) 
     if (matrix[x-1][y-1] == matrix[x][y]) 
      return 1 + FindAdjacent(x-1,y-1); 
     .. Repeat for all 7 other adjacent locations (-1, +0) (+0, -1) (+1, -1) (-1, +1) (+1, +1) (+1, 0) (0, +1) 
     else return 1; 

這個程序會給出一個座標x,y,返回圍繞它的符號在「斑點」。
注意:這也意味着對一組符號進行分組,例如連續3個符號,其中1個符號在下面的一列中。

如果您要爲矩陣中的每個位置調用一次,並查看一次所有遞歸級別的返回值是否爲>= k,那可能會解決您的問題。請記住做邊界檢查,以便不檢查矩陣[-1] [ - 1]或任何東西。

+0

事實上,我認爲OP是要求在同一行,或同一列或對角n次出現,你的方法是找到n-連接的單元格,連接意味着兩個單元格相鄰(並且相鄰的對角線)。所以我不確定你的建議是正確的。你的方法最大的問題是,如果單元格A和單元格B相鄰,建議的方式是運行不間斷因爲FindAdjacent(A)將找到B,並且它將依次調用FindAjacent(B)並且將找到A,然後在打電話FindAdjacent(A).... –

0

你會運行很多嵌套的循環,我會想象。不要忘記所有的對角線。

array[1][1] is just below array[0][1] above array[2][1] to the left of array[1][2] to the right of array[1][0] and diagonal to four different points: 

diagonal up and to the left is array[0][0] 
diagonal up and to the right is array[0][2] 
down and to the left is array [2][0] 
down and to the right is array[2][2] 

[0][0] | [0][1] | [0][2] 
[1][0] | [1][1] | [1][2] 
[2][0] | [2][1] | [2][2] 

我認爲數組[x] [y]是非常具有誤導性的,如果你繪製了很多圖。數組[行] [列]更好。

1

首先,不要相信你的「思想」。寫出真實的代碼以確保可以進行行和列檢查。

的想法應該是直接的:

遍歷棋盤。假設左上角是[0,0],然後右轉([0,1],[0,2] ...),直到碰到右邊界。然後轉到下一行。完成,直到你擊中右下角的框。

對於每個盒子,檢查是否有k發生1.向右,2.向下,3.對角地向左下,4.對角地向右下。

如果發生4箇中的任何一個,則返回true,否則返回下一個單元格。

作爲例子,下面是一些示例僞代碼:

迭代通過板:

ROWS=8; 
COLS=8; 
char[ROWS][COLS] board; 
k = 3; // occurrence 

for (x = 0 to COLS-1) { 
    for (y = 0 to ROWS-1) { 
    checkRightward(x, y, k); 
    // checkDownward(...) 
    } 
} 

樣本checkRightward:

checkRightward(x,y,k) { 
    char symbol = board[y][x]; 
    noOfOccurence = 0; 
    for (currentX = x; currentX < COLS ; ++currentX) { 
    if (board[y][currentX] == symbol) { 
     noOfOccurence++; 
    } else { 
     break; // jump out from the loop 
    } 
    } 

    return (noOfOccurence >= k); 
} 

應該不難爲你翻譯想法到Java,並添加其他缺少檢查。


編輯:因爲在筆者看來真的不明白我在說什麼......所以我提出的想法有點視覺呈現:

假設一個8×8板,它的東西像這樣:

  X 
    0 1 2 3 4 5 6 7 
    0 
    1 
    2 
    3  * ----> 
Y 4 /| \ 
    5 |/_ | _\| 
    6  V  
    7 

在上述圖中,[X,Y]的當前小區(具有星號*的位置)的座標是[3,3]。你所要做的就是檢查

1)右: 這意味着檢查[3,3],[4,3],[5,3] ...相同符號的

2)向下: 這意味着檢查[3,3],[3,4],[3,5] ......是相同的符號

3)的右對角線: 這意味着檢查如果[3,3],[4,4],[5,5] ....具有相同的符號

4)左對角線: 這意味着檢查[3,3],[2 ,4],[1,5] ....具有相同的符號

您從[0,0]單元開始檢查,然後[1,0],[2,0] ...然後[0,1],[1,1] [2,1] ......直到你找到一個成功的4格檢查中的任何一個格子,或者當你擊中最後一格時([7,7])。

+0

非常感謝你的幫助!我設法實現了這個算法,很好,而且效果很好。但是,檢查左對角線時遇到了一些麻煩。右對角線正常工作,但由於某種原因,對於左對角線也是如此。我在我的問題中發佈了左對角代碼,所以如果您可以就我如何做到這一點給出任何建議,我將非常感激。再次感謝! – user41419

0
for(i=0;i<row;i++) 
For(j=0;j<column;j++){ 
current = Arr[row][col]; 
For(count=0;count<k;count++) 
{ 
If(current==arr[row][col+count]) 
Flagcol=true 
Else 
Flagcol=false 
} 
For(count=0;count<k;count++) 
{ 
If(current==arr[row+count][col]) 
Flagrow=true 
else 
Flagrow=false 
} 
For(count=0;count<k;count++) 
{ 
If(current==arr[row+count][col+count]) 
Flagdiagnoltrue 
Else 
Flagdiagnol=false 
} 
} 
} 

一個非常粗略的草稿給想法..請記住一件事,你將需要檢查的行+計數/ COL +數應不超過行/ count..else outofbondsexception ..: - d

相關問題