• 8皇后问题--回溯法 (循环递归)


    N皇后问题


    问题描写叙述:
    N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自己主动攻击)


    1.因为每一个棋子不可能同行。因此能够理解为从棋盘每行拿个棋子出来
    2.因为每列棋子也不同样,因此没有同一个数字能够在一个列
    3.综合1,2。问题转化为给[0-7]做全排列,然后满足没有两个数字在同一个斜线
    4.依据斜率公式 (x1-x2)/(y1-y2),因此依据这个条件排出同线的组合
    5.余下的组合即为每行棋子的列位置,索引,就是行号


    var MAX = 8;
    
    var Ann = function a(arr){
    
    
    if(arr.length == 1){return arr;}
    
    
    var rr = new Array();
    for(var i = 0; i<arr.length;i++){
    
    
    //get a copy
    var ar = new Array();
    for(var j = 0; j < arr.length;j++){ar[j] = arr[j];}
    
    
    //assume i
    var current = ar[i];
    ar.splice(i,1);
    
    
    var childRet = a(ar);
    
    
    for(var k = 0 ;k < childRet.length;k++){
    var str = (current + "," + childRet[k]);
    
    if(str.length != 2 * MAX-1 || !sameLine(str)){
    rr.push(str);
    }
    
    }
    
    
    }
    
    
    return rr;
    }
    
    var initArr = new Array();
    for(var i = 0;i < MAX; i++){initArr.push(i);}
    
    var ret = Ann(initArr);
    
    for(var i = 0;i < ret.length;i++){
    outRet(ret[i]);
    }
    
    
    var count = 0;
    
    function outRet(r) {
    count = count + 1;
    console.log("==============" + "," + count.toString());
    var a = r.split(',');
    for(var i = 0;i < MAX; i++){
    
    var aa = new Array();
    for(var j = 0;j < MAX; j++){
    aa.push(0);
    }
    aa[a[i]] = 1;
    console.log(aa);
    
    }
    }
    
    
    function sameLine(str){
    var arr = str.split(',');
    for(var i = 0;i < arr.length; i++){
    for(var j = 0;j < arr.length; j++){
    if(i!=j&&Math.abs(i-j) == Math.abs(arr[i]-arr[j])){return true;}
    }
    
    }
    return false;
    
    }
    


  • 相关阅读:
    Django的mysql配置
    解决mysql问题
    angular(3)服务 --注入---自定义模块--单页面应用
    GIT常用命令整理
    Angular(2)
    Angular(1)
    响应式布局 Bootstrap(01)
    Ajax (一)
    (转)经济学中的风险和不确定性的区别是什么?
    JQuery
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5193900.html
Copyright © 2020-2023  润新知