【算法总结-回溯法】回溯与八皇后

<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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值