JavaScript之八皇后問題(遞歸)

??八皇后問題,是一個古老而著名的問題,該問題最早由國際西洋棋棋手馬克斯·貝瑟爾(Max Bezzel)于1848年提出。八皇后問題的具體描述為:在8*8的國際象棋上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。
??八皇后問題,是回溯算法的典型案例。本次分享講使用遞歸法來尋找八皇后問題的所有解,并用JavaScript語言來寫,同時學習JavaScript中OOP方面的知識。
??八皇后問題的完整代碼如下:

<html>
<body>

<script>
//create a class 
function eightQueen(arr, cnt) {
    //parameters
    this.arr = arr;
    this.cnt = cnt;
    
    //methods
    this.search = function(r){
        //if r == 8, then a solution is found
        if(r==8){
            document.write('<br>'+this.cnt+'<br>');
            this.output(this.arr);
            this.cnt++;
            return null
        }
        for(var i=0;i<8;i++){
            this.arr[r] = i;
            flag = 1
            for(var j=0;j<r;j++){
                //check if this position is valid
                if(this.arr[r] == this.arr[j] || r-j == Math.abs(this.arr[r]-this.arr[j])){
                    flag = 0;
                    break;
                }
            }
            // if flag == 1, then the row numbered r is valid
            if(flag)    this.search(r+1); //search the next row
        }
    }
    //output the valid solutions in format
    this.output = function() {
        for(var i=0; i<8;i++){
            for(var j=0; j<8;j++){
                pos = (j==arr[i]) ? '1 ' : '0 ';
                document.write(pos);
            }
            document.write('<br>');
        }
    }
}

//Initial array
var arr = [-1,-1,-1,-1,-1,-1,-1,-1]
//create a object
var eq = new eightQueen(arr,1);
//use object's method to find all solutions and print them
eq.search(0);

</script>

</body>
</html>

在上述JavaScript代碼中,首先定義了一個類(Class):eightQueen,它的參數為:arr,cnt,其中arr為初始化數組,而cnt可以對方法計數。在eightQueen定義了方法search(),參數為r(第r行),當r等于8時,就找到了一個有效解,同時調用output()函數將這個有效解輸出,當找到第r行的有效解后,再去尋找下一行的有效解。利用參數cnt可以幫助我們計數,這樣我們就能找到所有有效解的數量。
??該代碼在網頁中運行的結果如下所示:

八皇后問題的解(部分)

可以看出,所有有效解的數量為92.
??當然,在HTML中可以用更加好的可視化方法來展示,歡迎有興趣的同學多多嘗試~~
??本次分享到此結束,歡迎大家交流~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容