107

私は競技プログラミングに慣れていませんが、優れたコーダーの多くがコードに次の 4 行を持っていることに頻繁に気付きました (特に配列を含むもの)。

int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 };
int diK[] = { -2, -2, -1, 1, 2, 2, 1, -1 };
int djK[] = { -1, 1, 2, 2, 1, -1, -2, -2 };

これは実際には何を意味し、テクニックは何のために使用されるのでしょうか?

4

3 に答える 3

65

パタシュの説明を理解するのが難しいと思う人のために、私は明確にしようとします.

チェス盤の特定の点からのすべての可能な動きを検討しようとしていると想像してください。

di および dj 配列をループ処理し、di 値を x オフセットとして解釈し、dj 値を y オフセットとして解釈すると、考えられる 8 つの方向のそれぞれをカバーします。

正の x が東で、正の y が南であると仮定すると (パタシュの答えのように)、次のようになります。

  | | ディ/エックス | dj/y | 方向
--+--------+------+-----------
0 | 1 | 0 | 東
1 | -1 | 0 | 西
2 | 0 | 1 | 南
3 | 0 | -1 | 北
4 | 1 | 1 | 南東
5 | -1 | -1 | 北西
6 | 1 | -1 | 北東
7 | -1 | 1 | 南西

diK 配列と djK 配列は、騎士の駒の可能な動きを確立するために同じ方法で解釈できます。チェスに慣れていない場合、ナイトは L パターンで移動します。一方向に 2 つの正方形があり、次にそれに対して直角に 1 つの正方形があります (またはその逆)。

  | | ディK/x | djK/年 | 方向
--+---------+-------+----------------
0 | -2 | -1 | 西に2つ、北に1つ
1 | -2 | 1 | 西に2つ、南に1つ
2 | -1 | 2 | 西1、南2
3 | 1 | 2 | 東に1つ、南に2つ
4 | 2 | 1 | 東に2つ、南に1つ
5 | 2 | -1 | 東に2つ、北に1つ
6 | 1 | -2 | 東に1つ、北に2つ
7 | -1 | -2 | 1 西、2 北
于 2013-05-03T04:44:52.910 に答える
1

定義された配列を使用して、すべての方向で可能な移動量をチェックするコードの小さなスニペット。

int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 };
int movesPossible[8];
int move = 0;
int posx, posy; // position of the figure we are checking

for (int d=0; d<8; d++) {
  for (move = 1; board.getElt(posx+di[d]*move, posy+dj[d]*move)==EMPTY; move++) ;
  movesPossible[d] = move-1;
}
于 2013-05-29T12:20:57.640 に答える