2つの騎士と5つの5チェス盤の2つのルーキー

2人の騎士と2人のルーキは何点も5ドル5倍のチェス盤に置くことができるので、どのピースも別のピースを攻撃しないようにいくつの方法がありますか?

ベストアンサー

私は簡単なブルートフォースのコンピュータプログラムを走らせました。それは単純にすべての可能性を反復して数えます。

それは見つけた:

2184ソリューション。

この数は対称性のために減少しないので、各配列は8回までカウントされている可能性があります(4回転とその鏡像)。

私はこれのために以下に使用した簡単なC#ソースコードです。

編集: 私は今、すべてのソリューションの対称数を数えました。結果は次のとおりです。

対称性のないソリューション(8回カウント)
 鏡面対称で対角線に沿った36のソリューション(4回カウント)
 わずか180度の回転対称性を持つ4つのソリューション(4回カウント)
 ミラーと回転対称性を持つ4つのソリューション(2回カウント)
 252 * 8 + 36 * 4 + 4 * 4 + 4 * 2 = 2184
 252 + 36 + 4 + 4 = 296本質的にユニークなソリューション

回転対称性のみを有する解は、

. R . . .    . R . . .    . R . . .    . . . . .
K . . . .    . . K . .    . . . . K    . R . . .
. . . . .    . . . . .    . . . . .    K . . . K
. . . . K    . . K . .    K . . . .    . . . R .
. . . R .    . . . R .    . . . R .    . . . . .

回転と反射の両方の対称性を持つものは次のとおりです。

R . . . .    R . . . .    K . . . .    K . . . .
. K . . .    . . . K .    . R . . .    . . . R .
. . . . .    . . . . .    . . . . .    . . . . .
. . . K .    . K . . .    . . . R .    . R . . .
. . . . R    . . . . R    . . . . K    . . . . K

ソースコード:

  private static long count = 0;
  private static void Main()
  {
     Rook1();
  }
  private static void Rook1()
  {
     for (int r1x = 0; r1x < 5; r1x++)
     {
        for (int r1y = 0; r1y < 5; r1y++)
        {
           Rook2(r1x, r1y);
        }
     }
  }
  private static void Rook2(int r1x, int r1y)
  {
     for (int r2x = r1x+1; r2x < 5; r2x++)
     {
        for (int r2y = 0; r2y < 5; r2y++)
        {
           if (r1y == r2y) continue;
           Knight1(r1x, r1y, r2x, r2y);
        }
     }
  }
  private static void Knight1(int r1x, int r1y, int r2x, int r2y)
  {
     for (int k1x = 0; k1x < 5; k1x++)
     {
        if (k1x == r1x || k1x == r2x) continue;
        for (int k1y = 0; k1y < 5; k1y++)
        {
           if (k1y == r1y || k1y == r2y) continue;
           if (Math.Abs(k1x - r1x) == 1 && Math.Abs(k1y - r1y) == 2) continue;
           if (Math.Abs(k1x - r1x) == 2 && Math.Abs(k1y - r1y) == 1) continue;
           if (Math.Abs(k1x - r2x) == 1 && Math.Abs(k1y - r2y) == 2) continue;
           if (Math.Abs(k1x - r2x) == 2 && Math.Abs(k1y - r2y) == 1) continue;
           Knight2(r1x, r1y, r2x, r2y, k1x, k1y);
        }
     }
  }
  private static void Knight2(int r1x, int r1y, int r2x, int r2y, int k1x, int k1y)
  {
     for (int k2x = k1x; k2x < 5; k2x++)
     {
        if (k2x == r1x || k2x == r2x) continue;
        for (int k2y = 0; k2y < 5; k2y++)
        {
           if (k2x == k1x && k2y <= k1y) continue;
           if (k2y == r1y || k2y == r2y) continue;
           if (Math.Abs(k2x - r1x) == 1 && Math.Abs(k2y - r1y) == 2) continue;
           if (Math.Abs(k2x - r1x) == 2 && Math.Abs(k2y - r1y) == 1) continue;
           if (Math.Abs(k2x - r2x) == 1 && Math.Abs(k2y - r2y) == 2) continue;
           if (Math.Abs(k2x - r2x) == 2 && Math.Abs(k2y - r2y) == 1) continue;
           if (Math.Abs(k2x - k1x) == 1 && Math.Abs(k2y - k1y) == 2) continue;
           if (Math.Abs(k2x - k1x) == 2 && Math.Abs(k2y - k1y) == 1) continue;
           count++;
           Console.WriteLine( "{8}: R{0}{1} R{2}{3} K{4}{5} K{6}{7}", r1x+1, r1y+1, r2x+1, r2y+1, k1x+1, k1y+1, k2x+1, k2y+1, count);
        }
     }
  }

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です