<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> test </title>
</head>
<body>
<div>
<?php
/*八皇后问题代码实现
*
*
*
*/
//根据前几行的放置情况,判断这一行是否合法
function attack($n){
global $chess;
for($i=1;$i<=$n-1;$i++){
if($chess[$n]==$chess[$i]+($n-$i)||$chess[$n]==$chess[$i]-($n-$i)||$chess[$n]==$chess[$i]){
return true;
}
}
return false;
}
//输出每种可能的解
function display(){
global $chess;
global $solution;
echo " solution".sprintf("% 2d",$solution).":";
for($i=1;$i<=8;$i++){
$img = "<img src='../images/$chess[$i].png'/>";
echo $img;
}
echo "</br>";
$solution++;
}
//递归放置皇后
function putchess($n){
global $chess;
global $solution;
for($i=1;$i<=8;$i++){
$chess[$n] =$i;
if(!attack($n)){//没有冲突
if($n==8){//已经放满,输出
display();
}
else{
putchess($n+1);
}
}//if
}//for
}
printf("八皇后问题的解如下:<br/>");
$solution = 1;
//$chess=array(1,2,3,4,5,6,7,8);
putchess(1);
echo "共有".($solution-1)."种不同的八皇后放置方法";
?>
</div>
</body>
</html>
效果图:
python版本的解法如下:
def conflict(state,nextX):
nextY = len(state)
for i in range(nextY):
if(abs(state[i]-nextX)) in (0,nextY-i):
return True
return False
def queens(num = 8,state = ()):
for pos in range(num):
if not conflict(state,pos):
if len(state) == num-1:
yield (pos,)
else:
for result in queens(num,state+(pos,)):
yield (pos,)+result
def prettyprint(solution):
def line(pos,length = len(solution)):
return '. '*(pos) +'X '+'. '*(length-pos-1)
for pos in solution:
print line(pos)
import random
prettyprint(random.choice(list(queens(8))))
print len(list(queens(8)))
结果:
. . X . . . . .
. . . . X . . .
. . . . . . X .
X . . . . . . .
. . . X . . . .
. X . . . . . .
. . . . . . . X
. . . . . X . .
92