2

写真がないとわかりにくいかもしれませんが、王様がチェックされているか確認中です。そうするために、私は王の位置から始めて、上、左、下、右、そしてすべての斜めのパターンに行きます.

コードを簡素化するために、開始場所と終了場所を受け取り、そのパスに王に対する脅威がある場合に true を返すパス チェッカー メソッドがあります。したがって、このメソッドを次のように呼び出しています。

board.incheckPath(kingLocation, new Location(8, kingY))

これは、キングから一番上の行、同じ列までチェックします。左、下、右についても同様のステートメントがあります。

問題は、対角線パターンに同じ方法を使用しようとしていて、最後の場所がどこにあるかを把握するための単純なアルゴリズムを理解できないことです。あなたが右にいるよりも高い場合は、右斜め上に行くと、一番右の列に当たる前に一番上の行に当たります. その場所のアルゴリズムは次のとおりです。

if x > y { row = 8; column = 8-(x-y) } else { row = 8-(x-y); column = 8; }

着陸する場所は、一番上の行または右の列から離れた x と y の差になるからです。しかし、上下左右、上下左右の結果がどうなるかわかりません。

4

3 に答える 3

2

あなたの座標が

/|\ y
 |              col8
 +---+ ... +---+---+
 |   |     |   |   | <- row 8
 +---+ ... +---+---+
 |   |     |   |   | 
 +---+ ... +---+---+
 ...............
 +---+ ... +---+---+
 |   |     |   |   | <- row 1
 +---+ ... +---+---+--->
                       x

ソリューションを拡張すると、次のようになります

// Up right
if (y > x) { row = 8; column = 8-(y-x) } else { row = 8-(x-y); column = 8; }

// Down left
if (x > y) { row = 1; column = 1+(x-y) } else { row = 1+(y-x); column = 1; }

// Up left
if (9-x < y) { row = 8; column = x+y-8 } else { row = x+y-1; column = 1; }

// Down right
if (9-x > y) { row = 1; column = x+y-1 } else { row = x+y-8; column = 8; }
于 2013-12-17T19:51:08.333 に答える
2

別のより適切な方法でパスを定義することをお勧めします。

 int pathDeltas[][] = {
     {1, 0}, {0, 1}, {-1, 0}, {0, -1}, // Up, down, left, right
     {1, 1}, {-1, 1}, {1, -1}, {-1, -1}, // diagonal paths
 };

次に、種類の位置から開始して、1 または 8 の値に到達するまで、x 座標と y 座標にデルタを追加します。また、次のようにナイト パスを計算することもできます。

int knightDeltas[][] {{1, 2}, {2, 1}, {-1, 2}, {-2, 1},
                     {1, -2}, {2, -1}, {-1, -2}, {-2, -1}};
于 2013-12-17T18:55:38.320 に答える
0

to M Cliatt, 2013, (R,C) (R と C は [1..8] から) で定義される正方形から、8x8 ボードで壁にぶつかるまでの各方向の対角方向の歩数

NE = Min(8 - R, 8 - C)
NW = Min(8 - R, C - 1)
SE = Min(R - 1, 8 - C)
SW = Min(R - 1, C - 1)

ボード上の瞬間の反射は、これらが対角線に沿って分割されていることを示しています (NE、SW はこのように分割されています)、および反対角線 (NW、SE) に沿って分割されています...たとえば、NE では対角線の上に 8-R ブランチが常に選択され、対角線の下では 8- C ブランチは常に選択されます。それらは対角線上で等しいです。

したがって、(R,C) = (R + 8-R, C + 8-R) の対角線の上の正方形から始まる NE 方向の光線の最後の要素

ところで - 司教の法的な動きの妨害の文脈でこれについて考えてみてください (現時点で)...あなたがあなたの問題に行き着いた場所に興味があります

于 2016-06-15T10:36:37.933 に答える