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

<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

    原文作者:回溯法
    原文地址: https://blog.csdn.net/ohmygirl/article/details/6924229
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞