ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

递归-N皇后问题

2021-02-13 18:01:30  阅读:132  来源: 互联网

标签:递归 res pos mostRightOne 问题 limit 皇后 colLimit


1.PHP实现

 1 //N皇后
 2 //N皇后问题是指在N*N的棋盘上要摆N个皇后,要求
 3 //任何两个皇后不同行、不同列,也不在同一条直线上
 4 //给定一个证数n,返回n皇后的摆法有多少种
 5 
 6 function nQueen($n,$row=0,&$queen=[]){
 7    //
 8     if($row == $n){
 9         return 1;
10     }
11     $res = 0;
12     //对于同一行,遍历所有的列,找到符合条件的所有位置
13     for($col=0;$col<$n;$col++){
14         if(isValid($queen,$row,$col)){
15             $queen[$row] = $col;
16             $res +=  nQueen($n,$row+1,$queen);
17         }
18     }
19     return $res;
20 }
21 //验证位置是否可以放置皇后
22 function isValid($queen=[],$row,$col){
23     //$len = count($queen);
24     //判断[$row,$col]放置的皇后是否与假设冲突
25     for($i=0;$i<$row;$i++){
26         //如果在同一列、或在同一条对角线上
27         if($queen[$i]==$col||(abs($i-$row)==abs($queen[$i]-$col))){
28             return false;
29         }
30     }
31     return true;
32 }
33 
34 //方法二:
//$limit是一个由n位1构成的二进制数 35 //$colLimit是一个n位的二进制数,0的位置可以放皇后(列限制) 36 //$leftLimit是一个n位的二进制数,0的位置可以放皇后(左对角线限制) 37 //$rightLimit是一个n位的二进制数,0的位置可以放皇后(右对角线限制) 38 function nQueen2($limit,$colLimit,$leftLimit,$rightLimit){ 39 40 if($colLimit==$limit) 41 return 1; 42 $pos = $limit & (~($colLimit|$leftLimit|$rightLimit)); 43 $mostRightOne = 0; 44 $res = 0; 45 while($pos!=0){ 46 //取出最右边的1的位置 47 $mostRightOne = $pos & (~$pos +1); 48 $pos = $pos - $mostRightOne; 49 $res += nQueen2($limit,$colLimit|$mostRightOne,($leftLimit|$mostRightOne)<<1,($rightLimit|$mostRightOne)>>1); 50 } 51 return $res; 52 } 53 54 $n = 5; 55 //$arr = array_fill(0,$n,1); 56 $queen=[]; 57 $res = nQueen($n,0,$queen); 58 print($res); 59 print("\n"); 60 print_r($queen); 61 62 $limit = (1<<$n)-1; 63 $res2 = nQueen2($limit,0,0,0); 64 print("\n"); 65 print($res2);

 

标签:递归,res,pos,mostRightOne,问题,limit,皇后,colLimit
来源: https://www.cnblogs.com/indifferent/p/14400454.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有