Satrançta, bir kraliçe tahta yatay, dikey veya çapraz olarak uzayabilir.
NxN boyutlu bir satranç tahtası göz önüne alındığında, N kraliçesinin tahtaya kaç tane pozisyon yerleştirilebileceğini yazdırın ve 1 hamlede birbirlerine vuramazsınız.
Satrançta, bir kraliçe tahta yatay, dikey veya çapraz olarak uzayabilir.
NxN boyutlu bir satranç tahtası göz önüne alındığında, N kraliçesinin tahtaya kaç tane pozisyon yerleştirilebileceğini yazdırın ve 1 hamlede birbirlerine vuramazsınız.
Yanıtlar:
İşte bir çözüm (aslında bu blog girişinden ), daha sonra Mathematica tarafından çözülen konjonktif normal formda çözümün mantıklı bir açıklamasını oluşturuyorum:
(* 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
İşte çıktı:
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
itertools ithalatından * n = girişi () baskı len (filtre (lambda x: tüm + (1E9) + x [i + 1:])), permütasyon (aralık (1, n + 1), n)))
Düz-se bile orada değildi kodu golf etiketi kabul. N stdin'den okunur, program kabul edilebilir sürede n = 10'a kadar olan çözümleri hesaplar.
harika
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()
}
Bunun gibi tüm kraliçe çözümlerinin bir listesini sunar:
[ [4, 7, 3, 0, 6, 1, 5, 2],
[6, 2, 7, 1, 4, 0, 5, 3],
... ]
Grafik gösterim için şunu ekleyin:
s.each { def size = it.size()
it.each { (it-1).times { print "|_" }
print "|Q"
(size-it).times { print "|_" }
println "|"
}
println ""
}
ki şuna benzer:
|_|Q|_|_|_|_|_|_|
|_|_|_|Q|_|_|_|_|
|_|_|_|_|_|Q|_|_|
|_|_|_|_|_|_|_|Q|
|_|_|Q|_|_|_|_|_|
|Q|_|_|_|_|_|_|_|
|_|_|_|_|_|_|Q|_|
|_|_|_|_|Q|_|_|_|