標籤: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(" "));}}