N-クイーンズ問題[終了]


9

チェスでは、クイーンがボードが水平、垂直、または斜めに伸びている限り移動できます。

NxNサイズのチェス盤を想定して、盤上に配置できるNクイーンが可能なポジションの数を印刷します。


2 <= N <= 4のケースを処理する必要がありますか?もしそうなら?
st0le

ケースの解決策はありません:N = 2,3。ウィキペディアには、この古典的な問題に関する優れた記事があります。それは、N = 1からN = 14までのソリューション番号について十分に文書化しています(私はまだCode Golfを初めて使用します。参加するための最良の方法はまだ
わかり

回答:


4

これが(もともとこのブログエントリからの)解決策です。ここで、解決策の論理的な説明を論理積形式で構成し、Mathematicaで解決します。

(* Define the variables: Q[i,j] indicates whether there is a 
   Queen in row i, column j *)
Qs = Array[Q, {8, 8}];

(* Define the logical constraints. *)
problem =
  And[
   (* Each row must have a queen. *)
   And @@ Map[(Or @@ #) &, Qs],
   (* for all i,j: Q[i,j] implies Not[...] *)
   And @@ Flatten[
     Qs /. Q[i_, j_] :>
       And @@ Map[Implies[Q[i, j], Not[#]] &, 
         Cases[Qs, 
          Q[k_, l_] /;
           Not[(i == k) && (j == l)] && (
             (i == k) ||          (* same row *)
                 (j == l) ||          (* same column *)
             (i + j == k + l) ||  (* same / diagonal *)
             (i - j == k - l)),   (* same \ diagonal *)
          2]]]];

(* Find the solution *)
solution = FindInstance[problem, Flatten[Qs], Booleans] ;

(* Display the solution *)
Qs /. First[solution] /. {True -> Q, False -> x} // MatrixForm

出力は次のとおりです。

x   x   x   x   Q   x   x   x
x   Q   x   x   x   x   x   x
x   x   x   Q   x   x   x   x
x   x   x   x   x   x   Q   x
x   x   Q   x   x   x   x   x
x   x   x   x   x   x   x   Q
x   x   x   x   x   Q   x   x
Q   x   x   x   x   x   x   x

0

ルビー

golfタグが表示されないので、これは単なる挑戦だと思います。

ウィキペディアで言及されているアルゴリズムの実装は次のとおりです。それは私ではなく、Rosetta Stoneにあり、ここで見つけることができます

この回答をCommWikiで公開しました。


0

Python 2、190 185文字

itertoolsインポートから*
n = input()
len(filter(lambda x:all(1 ^(y in(z、z + ij、z-i + j))for enumerate(x)for j、z in enumerate(x [:i] +(1e9、)+ x [i + 1:]))、permutations(range(1、n + 1)、n)))

コードのゴルフタグがなくても、それを想定しました。Nはstdinから読み取られ、プログラムは許容時間内でn = 10までの解を計算します。


0

グルーヴィー

n=8
s=(1..n).permutations().findAll{ 
  def x=0,y=0
  Set a=it.collect{it-x++} 
  Set b=it.collect{it+y++} 
  a.size()==it.size()&&b.size()==it.size() 
}

次のようなすべてのクイーンソリューションのリストを提供します。

[ [4, 7, 3, 0, 6, 1, 5, 2], 
  [6, 2, 7, 1, 4, 0, 5, 3], 
  ... ]

グラフィカルな表現の場合、以下を追加します。

s.each { def size = it.size()
         it.each { (it-1).times { print "|_" }
                   print "|Q"
                   (size-it).times { print "|_" }
                   println "|"
                 }
         println ""
         }      

これは次のようになります:

|_|Q|_|_|_|_|_|_|
|_|_|_|Q|_|_|_|_|
|_|_|_|_|_|Q|_|_|
|_|_|_|_|_|_|_|Q|
|_|_|Q|_|_|_|_|_|
|Q|_|_|_|_|_|_|_|
|_|_|_|_|_|_|Q|_|
|_|_|_|_|Q|_|_|_|
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.