N皇后问题[关闭]


9

在国际象棋中,女王可以移动到棋盘水平,垂直或对角线延伸的程度。

给定NxN大小的棋盘,请打印出N个皇后可以在棋盘上放置多少个位置,并且一举步就不能互相击中。


我们是否需要处理2个<= N <= 4个案例?如果可以,怎么办?
st0le 2011年

情况没有解决方案:N = 2,3。维基百科上有关于这个经典问题的出色文章。它记录版本以及有关从N个解数= 1到N = 14(我还是新的代码高尔夫不知道什么是对尚未参与的最好方式:))
Dongshengcn

Answers:


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标签,所以我假设这只是一个挑战。

这是维基百科上提到的算法的实现。不是我的,是罗塞塔·斯通的,可以在这里找到

将此答案告知Wiki。


0

Python 2,190185个字符

从itertools import *
n =输入()
打印len(filter(lambda x:all(1 ^(y in(z,z + ij,z-i + j))for in,in enumerate(x)for j,z in enumerate(x [:i] +(1e9,)+ x [i + 1:])),排列(范围(1,n + 1),n)))

我只是以代码高尔夫标签为前提,即使它不存在。从标准输入读取N,程序在可接受的时间内计算出n = 10的解。


0

Groovy

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|_|_|_|
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.