まず、あなたの「思考」を信用しないでください。実際のコードを書き出して、行と列のチェックが機能することを確認します。
アイデアは単純明快でなければなりません:
チェッカーボードをループします。左上が[0,0]であると仮定し、右の境界に達するまで右に進みます([0,1]、[0,2] ...)。次に、次の行に進みます。右下のボックスに到達するまで終了します。
各ボックスについて、1。右、2。下、3。斜めから左下、4。斜めから右下のk個のオカレンスがあるかどうかを確認します。
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(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])にヒットしたセルが見つかりました。