求八皇后问题的92个解并在棋盘上显示它们

来源:互联网 发布:室内设计师 知乎 编辑:程序博客网 时间:2024/05/05 13:46

问题描述

八皇后问题是算法教程里面的标准例子。在 8×8 的国际象棋棋盘中放如八个后, 如何能让谁也吃不到谁。这要求任意两个 棋子,既不在同一行、不在 同一列,也不在同一对角线上。推而广之的是 n(>3) 皇后问题在 n×n的棋盘中摆放的问题。

转帖代码

dark=RGBColor[0.8196,0.5451,0.2784];light=RGBColor[1,0.8078,0.6196];queen=Import["http://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Chess_qlt45.svg/200px-Chess_qlt45.svg.png"]range=Partition[Range[64],8];range=MapAt[Boole[EvenQ[#]]&,range,1;;8;;2];range=MapAt[Boole[OddQ[#]]&,range,2;;8;;2];takenByQueen[{i_,j_}]:=Module[{boardElements},boardElements=Array[List,{8,8}];Union[boardElements[[i]],boardElements[[All,j]],Diagonal[boardElements,j-i],Diagonal[Reverse[board,2],(Length[board]-j+1)-i]]]bt[board_,row_,occupied_]:=Module[{available},available=Complement[Thread[{row,Range[8]}],occupied];If[row<9,bt[ReplacePart[board,#->1],row+1,Union[occupied,takenByQueen[#]]]&/@available,Sow[board/.{_,_}->0]];]board=Array[List,{8,8}];solutions=Reap[bt[board,1,{}]][[2,1]];drawBoard[board_]:=ArrayPlot[range,ColorRules->{0->light,1->dark},Epilog->(Inset[queen,#-1,#-1,1]&/@Position[board,1])]ListAnimate[drawBoard/@solutions]

输出结果:

这里写图片描述

深入参考

  1. CSDN博客文章:
  2. 高德纳的arXiv文章:
  3. 高教授的 代码1, 和 代码2 :
  4. 各种编程语言下求解该问题的代码
0 0
原创粉丝点击