📣 独立日限时特惠: VIP通行证立减$68
查看: 2317| 回复: 9
跳转到指定楼层
上一主题 下一主题
收起左侧

N-Queens疑问

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
  1. public class Solution {
  2.     public List<List<String>> solveNQueens(int n) {
  3.         List<List<String>> res = new ArrayList<List<String>>();
  4.         List<String> item = new ArrayList<String>();
  5.         if(n == 0)
  6.             return res;
  7.         int[] columnVal = new int[n];
  8.         dfs(n, res, columnVal, 0, item);
  9.         return res;
  10.     }
  11.     public boolean isValid(int row, int[] columnVal) {
  12.         for(int i = 0; i < row; i++) {
  13.             if(columnVal[row] == columnVal[i] || Math.abs(columnVal[row] - columnVal[i]) == row - i) {
  14.                 return false;
  15.             }
  16.         }
  17.         return true;
  18.     }
  19.     public void dfs(int n, List<List<String>> res, int[] columnVal, int row, List<String> item) {
  20.         if(n == row) {
  21.             for(int i = 0; i < n; i++) {
  22.                 StringBuilder tmp = new StringBuilder();
  23.                 for(int j = 0;j < n; j++) {
  24.                     if(j == columnVal[i])
  25.                         tmp.append('Q');
  26.                     else
  27.                         tmp.append('.');
  28.                 }
  29.                 item.add(tmp.toString());
  30.         }
  31.             res.add(item);
  32.             return ;
  33.     }
  34.         for(int i = 0; i < n; i++) {
  35.             columnVal[row] = i;
  36.             if(isValid(row, columnVal)) {
  37.                 dfs(n, res, columnVal, row + 1, item);
  38.             }
  39.         }
  40.     }
  41. }
复制代码
问下大侠这个oj上用9测试的时候为什么会超时啊。。。还有这个题的回溯为什么可以省掉= =谢谢了。。

上一篇:3sum 时间复杂度问题
下一篇:想问问大家,你在面试中遇到过leetcode上hard难度或者更难的算法题吗?
全局:
本帖最后由 zhuli19901106 于 2015-7-9 10:55 编辑

每次判断一个位置是否可放置只要O(1)的时间,为何要用循环?效率应该是差在这儿了。
你试试sudoku solver那题?同样类型的DFS回溯问题。


回溯与否倒不是问题的关键。

评分

参与人数 1大米 +10 收起 理由
zh355245849 + 10 感谢分享!

查看全部评分

回复

使用道具 举报

🔗
stellari 2015-7-9 17:10:36 | 只看该作者
全局:
本帖最后由 stellari 于 2015-7-9 17:16 编辑
zhuli19901106 发表于 2015-7-9 10:53
每次判断一个位置是否可放置只要O(1)的时间,为何要用循环?效率应该是差在这儿了。
你试试sudoku solver ...

请问判断一个位置是否可以放置如何用O(1)做到呢?是用HashSet之类的记录下之前的放置位置么?
回复

使用道具 举报

全局:
stellari 发表于 2015-7-9 17:10
请问判断一个位置是否可以放置如何用O(1)做到呢?是用HashSet之类的记录下之前的放置位置么?

八皇后要求不能同行、同列、同对角线或者同反对角线
如果我们一行一行地放,那么肯定不会同行,因此开三个数组分别记录 列、对角线、反对角线的占用情况
如果x和y的范围是[0, n - 1],那么对角线和反对角线位置分别可以表示为x + y和x - y + n - 1,范围都是[0, 2n - 2]
时刻维护这三个数组,就能O(1) 时间检查一个位置能不能放了。

评分

参与人数 1大米 +15 收起 理由
zh355245849 + 15 感谢分享!

查看全部评分

回复

使用道具 举报

🔗
stellari 2015-7-9 22:19:27 | 只看该作者
全局:
zhuli19901106 发表于 2015-7-9 21:28
八皇后要求不能同行、同列、同对角线或者同反对角线
如果我们一行一行地放,那么肯定不会同行,因此开三 ...

okay,这确实是个好办法。多谢分享!
回复

使用道具 举报

🔗
 楼主| zh355245849 2015-7-10 12:55:42 | 只看该作者
全局:
zhuli19901106 发表于 2015-7-9 10:53
每次判断一个位置是否可放置只要O(1)的时间,为何要用循环?效率应该是差在这儿了。
你试试sudoku solver ...

谢谢回答!我还想问下为什么回溯不是关键呢。。。因为我看网上很多都说是要回溯的。。。
回复

使用道具 举报

🔗
stellari 2015-7-10 14:17:21 | 只看该作者
全局:
zh355245849 发表于 2015-7-10 12:55
谢谢回答!我还想问下为什么回溯不是关键呢。。。因为我看网上很多都说是要回溯的。。。

我从一开始就想问了:什么叫“省掉回溯”?在我看来这是很标准的Backtracking算法,你说它“省掉"的哪一部分呢?
回复

使用道具 举报

🔗
pyx115 2015-7-12 06:13:14 | 只看该作者
全局:
zhuli19901106 发表于 2015-7-9 21:28
八皇后要求不能同行、同列、同对角线或者同反对角线
如果我们一行一行地放,那么肯定不会同行,因此开三 ...

大神,能写一下具体代码实现么,谢啦。大概明白你的意思,还是不知道怎么写。
回复

使用道具 举报

🔗
zhuli19901106 2015-7-12 10:51:58 | 只看该作者
全局:
本帖最后由 zhuli19901106 于 2015-7-12 12:35 编辑

发重了,请忽略
回复

使用道具 举报

🔗
zhuli19901106 2015-7-12 10:54:35 | 只看该作者
全局:
pyx115 发表于 2015-7-12 06:13
大神,能写一下具体代码实现么,谢啦。大概明白你的意思,还是不知道怎么写。

此处有代码,可供参考
https://raw.githubusercontent.co ... ode/master/n-queens(AC).cpp
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表