N皇后問題--回溯法 (迴圈遞迴)

來源:互聯網
上載者:User

標籤:style   blog   java   2014   os   javascript   

N皇后問題


問題描述:
N皇后問題是一個經典的問題,在一個N*N的棋盤上放置N個皇后,每行一個並使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊)


思路 (回溯法,迴圈遞迴):
0. 初始化棋盤(全部為0)
1. 依次將第一列棋子置為1
2. 放完棋子執行橫向,縱向,斜向的update,把不能放棋子的位置置為2
3. 從第二列棋子開始,遞迴執行
4. 執行到最後一列,退出遞迴
5. 執行第一列的第二個棋子


實現:



var N = 4;Array.prototype.count = function(c){var count = 0;for(var i = 0; i< this.length; i++){if(c(this[i])){count ++;}}return count ;}//init map var arr = new Array();for(var i = 0 ;i < N;i ++){var arr1 = new Array();for(var j = 0;j < N; j++){arr1.push(0);}arr.push(arr1);}var sln = new Array();var queen = function q(col,done){//find a vacancyvar zeroIndex = 0;while(zeroIndex < N && arr[zeroIndex][col] != 0){zeroIndex ++;}if(zeroIndex < N){arr[zeroIndex][col] = 1;//update positionsupdatePosition(zeroIndex,col);done ++;}if(col == N ){return ;}/* debugging console.log("arr : ");for(var i = 0 ;i < arr.length; i++){console.log (arr[i]);}*/if(done == N-1){var ar = new Array();for(var i = 0 ;i < arr.length; i++){var ar1 = new Array();for(var j = 0;j < arr[i].length; j++){ar1.push(arr[i][j]);arr[i][j] = 0;}ar.push(ar1);}sln.push(ar);}col ++;q(col,done);}var updatePosition = function (r,c){// horfor(var i = 0 ;i < c; i++){if(arr[r][i] == 0) {arr[r][i] = 2;}}for(var i = c ;i < N; i++){if(arr[r][i] == 0) {arr[r][i] = 2;}}//verfor(var i = 0 ;i < r; i++){if(arr[i][c] == 0) {arr[i][c] = 2;}}for(var i = r ;i < N; i++){if(arr[i][c] == 0) {arr[i][c] = 2;}}//r+,c+; r-,c-for(var i = r,j = c;i < N && j < N; i++, j++){if(arr[i][j] == 0){arr[i][j] = 2;}}for(var i = r,j = c;i >=0 && j >= 0; i--, j--){if(arr[i][j] == 0){arr[i][j] = 2;}}//r+,c-;r-,c+for(var i = r,j = c;i < N && j >= 0; i++, j--){if(arr[i][j] == 0){arr[i][j] = 2;}}for(var i = r,j = c;i >=0 && j < N; i--, j++){if(arr[i][j] == 0){arr[i][j] = 2;}}}for(var i = 0 ;i < N; i++){arr[i][0] = 1;updatePosition(i,0);queen(1,0);//console.log("================================");for(var j = 0; j < arr.length; j++){for(var k = 0 ;k  <arr[j].length; k++){arr[j][k] = 0;}}}console.log("for " + N + " - " + N + " queen , solutions : ") ;for(var i = 0 ; i< sln.length ;i++){console.log("=========sln : " + (i+1) + "====================");for(var j = 0; j < sln[i].length; j++){console.log(sln[i][j].join(" "));}}







聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.