“在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 :(得分:1)
最简单的(虽然不是最有效的,因为它可能会回溯)解决方案是想写一个递归函数,如下面的psuedocode
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,该例程将在'blob'中返回其周围的符号。
注意:这也意味着对符号进行分组,例如连续3个符号,下面的列旁边有1个符号。
如果您要对矩阵中的每个位置调用一次,并查看一旦所有递归级别返回的返回值是>= k
,这可能会解决您的问题。记得要做边界检查,这样就不会检查矩阵[-1] [ - 1]或其他任何内容。
答案 1 :(得分: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]会产生误导。 array [row] [column]更好。
答案 2 :(得分:0)
首先,不要相信你的“思想”。编写实际代码以确保您可以对行和列进行检查。
这个想法应该是直截了当的:
循环通过棋盘。假设左上角是[0,0],然后右转([0,1],[0,2] ...),直到你到达右边界。然后转到下一行。完成,直到你碰到右下方框。
对于每个方框,检查是否有k出现在右边,2。向下,3。对角线到左下方,4。对角线到右下方。
如果4中的任何一个发生,则返回true,否则,移至下一个单元格。
例如,这里有一些psuedocode示例:
通过董事会迭代:
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 x 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])。
答案 3 :(得分: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 +计数是否不应超过行/计数..这些outofbondsexception ..: - D