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

问题描述

八皇后问题是算法教程里面的标准例子。在 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. 各种编程语言下求解该问题的代码

你可能感兴趣的:(算法,代码,组合数学,Mathematica,八皇后问题)