首先,不要相信你的“思想”。写出真实的代码以确保可以进行行和列检查。
的想法应该是直接的:
遍历棋盘。假设左上角是[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])。
'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]'。 –
对于任何位置元组(x,y),对角线仅仅是(x + 1,y + 1)。如果您对特定问题有任何疑问,请鼓励编辑您提出的问题 - 根据问题的性质,根据需要提供代码。 – Makoto
您应该先编写用于检查行的代码。让它工作。然后转到列。一旦你得到这两个工作,对角线应该是相当明显的。 –