2012-10-15 23 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

相关问题