问题描述
八皇后问题是算法教程里面的标准例子。在 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]
输出结果:
深入参考
- CSDN博客文章:
- 高德纳的arXiv文章:
- 高教授的 代码1, 和 代码2 :
- 各种编程语言下求解该问题的代码