首先,不要相信你的「思想」。寫出真實的代碼以確保可以進行行和列檢查。
的想法應該是直接的:
遍歷棋盤。假設左上角是[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
您應該先編寫用於檢查行的代碼。讓它工作。然後轉到列。一旦你得到這兩個工作,對角線應該是相當明顯的。 –