博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode][JavaScript]N-Queens
阅读量:5066 次
发布时间:2019-06-12

本文共 2912 字,大约阅读时间需要 9 分钟。

N-Queens

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

For example,

There exist two distinct solutions to the 4-queens puzzle:

[ [".Q..",  // Solution 1  "...Q",  "Q...",  "..Q."], ["..Q.",  // Solution 2  "Q...",  "...Q",  ".Q.."]]

 

 


 

 

传说中的N皇后问题,据说AC了这题就能掌握图论搜索,进而称霸算法,然后迎娶白富美,走上人生巅峰。

不就是dfs嘛。

一行行地做dfs。每一轮先找这一行有哪些地方可以放Queen,把这些点置成Q,循环递归这些点,最后不要忘记把默认值'.'写回去。

如果到了最后一行,并且可以放得下Queen,这就是一个正确的解。

因为每一行只能放一个,如果遇到放不下的情况,说明已经错了。

找行上的候选人的时候,第一眼看上去要找8个方向。

但首先,行上就不用找了,列方向上和2个斜的方向上只需要找上半部分,因为下面都没开始放Q,肯定不冲突的。

1 /** 2  * @param {number} n 3  * @return {string[][]} 4  */ 5 var solveNQueens = function(n) { 6     var map = []; 7     var result = [];    8     buildMap(); 9     dfs(0);10     return result;11 12     function dfs(row){13         var i = 0, j = 0;14         var candidates = [];15         for(i = 0; i < n; i++){16             if(canPlaceQueen(row, i)){17                 candidates.push(i);18             }19         }20         if(row === n -1 && candidates.length !== 0){ //found21             map[row][candidates[0]] = 'Q';22             result.push(formatMap(map));23             map[row][candidates[0]] = '.';24             return;25         }26         for(i = 0; i < candidates.length; i++){27             map[row][candidates[i]] = 'Q';28             dfs(row + 1);29             map[row][candidates[i]] = '.';30         }31     }32     function canPlaceQueen(x, y){33         var cell = "";34         var i = 0, j = 0;35         for(i = 0; i < n; i++){36             cell = map[i][y];37             if(cell === 'Q'){38                 return false;39             } 40         }41         for(i = x, j = y; i >=0 && j >= 0; i--, j--){42             cell = map[i][j];43             if(cell === 'Q'){44                 return false;45             } 46         }47         for(i = x, j = y; i >=0 && j < n; i--, j++){48             cell = map[i][j];49             if(cell === 'Q'){50                 return false;51             } 52         }53         return true;54     }55     function buildMap(){56         var i = 0, j = 0;57         for(i = 0; i < n; i++){58             map[i] = [];59         }60         for(i = 0; i < n; i++){61             for(j = 0; j < n; j++){62                 map[i][j] = '.';63             }64         }65     }66     function formatMap(map){67         var res = [];68         var i = 0, j = 0;69         for(i = 0; i < n; i++){70             var tmp = "";71             for(j = 0; j < n; j++){72                 tmp += map[i][j];73             }74             res.push(tmp);75         }76         return res;77     }78 };

 

 

转载于:https://www.cnblogs.com/Liok3187/p/4558502.html

你可能感兴趣的文章
前端开发的正确姿势——各种文件的目录结构规划及引用
查看>>
2013年上半年 中级数据库工程师
查看>>
观察者设计模式
查看>>
第二十六讲:基础一开放封闭原则
查看>>
使用plsql developer 创建用户
查看>>
[POJ2342]Anniversary party(树dp)
查看>>
[HDOJ1061]Rightmost Digit
查看>>
Function types cannot have argument labels 错误解决方案
查看>>
大家看看这个参数inctype你是否使用过?我做了以下测试,欢迎拍砖!
查看>>
Non-zero exit code (1)
查看>>
session喜欢丢值且占内存,Cookis不安全,用什么可以代替呢?
查看>>
粒子编辑器的选择1
查看>>
win 7 系统ie浏览器升级11版本后,f12功能不可用的问题
查看>>
编程之美 set 12 快速找出故障机器
查看>>
C# 模拟鼠标操作
查看>>
Android UI事件处理
查看>>
Eclipse背景颜色修改
查看>>
使用TabLayout快速实现一个导航栏
查看>>
Web开发的那点事--业务层常用功能
查看>>
中国象棋程序的设计与实现(四)-- 一次“流产”的写书计划
查看>>