1. for the backtracking part, thanks to the video of stanford cs106b lecture 10 by Julie Zelenski for the nice explanation of recursion and backtracking, highly recommended.

  2. in hdu 2553 cout N-Queens solutions problem, dfs is used.

    // please ignore, below analysis is inaccurate, though for inspiration considerations, I decided to let it remain.

    and we use a extra occupied[] array to opimize the validation test, early termination when occupied[i]==1, and in function isSafe the test change from 3 to 2 comparisons.

    for the improvement, here is an analysis:

    noted that total call of dfs for n is less than factorial(n), for convenience we take as factorial(n),

    in this appoach, in pow(n,n)-factorial(n) cases, we conduct one comparison, and three for others

    otherwise, for all pow(n,n) cases, we must conduct three comparisons,

    blow is a list for n from 1 to 10,

   n        n!           n^n   n!/n^n
1 1 1 1.00000
2 2 4 0.50000
3 6 27 0.22222
4 24 256 0.09375
5 120 3125 0.03840
6 720 46656 0.01543
7 5040 823543 0.00612
8 40320 16777216 0.00240
9 362880 387420489 0.00094
10 3628800 10000000000 0.00036

the table shows that, for almost all of the cases of large n (n>=4), we reduce 3 to 1 comparison in doing validation check.

occupied[i] is initilized to 0, before dfs, mark.

occupied[val]=1;

after dfs, unmark,

occupied[val]=0;

where val is the value chosen.

inspirations from chapter 3 Decompositions of graphs

in Algorithms(算法概论), Sanjoy Dasgupta University of California, San Diego Christos Papadimitriou University of California at Berkeley Umesh Vazirani University of California at Berkeley.

// leetcode N-Queens(12ms)

class Solution {
vector<vector<string>> ans;
int N;
//int numofsol; void AddTo_ans(string &conf) {
vector<string> vecstrtmp;
string strtmp(N,'.');
for(auto ind: conf) {
vecstrtmp.push_back(strtmp);
vecstrtmp.back()[(size_t)ind-1]='Q';
}
ans.push_back(vector<string>());
ans.back().swap(vecstrtmp);
}
void RecListNQueens(string soFar, string rest) {
if(rest.empty()) {
//++numofsol;
AddTo_ans(soFar);
}
else {
int i,j,len=soFar.size(), flag;
for(i=0;i<rest.size();++i) {
for(j=0;j<len;++j) {
flag=1;
if(soFar[j]-rest[i]==len-j || soFar[j]-rest[i]==j-len) {
flag=0; break;
}
}
if(flag) RecListNQueens(soFar+rest[i],rest.substr(0,i)+rest.substr(i+1));
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
ans.clear();
//numofsol=0;
N=n;
string str;
for(int i=1;i<=n;++i) str.push_back(i);
RecListNQueens("", str);
return ans;
}
};

// with a tiny modification,

// leetcode N-Queens II (8ms)

class Solution {
//vector<vector<string>> ans;
int N;
int numofsol; /*void AddTo_ans(string &conf) {
vector<string> vecstrtmp;
string strtmp(N,'.');
for(auto ind: conf) {
vecstrtmp.push_back(strtmp);
vecstrtmp.back()[(size_t)ind-1]='Q';
}
ans.push_back(vector<string>());
ans.back().swap(vecstrtmp);
}*/
void RecListNQueens(string soFar, string rest) {
if(rest.empty()) {
++numofsol;
//AddTo_ans(soFar);
}
else {
int i,j,len=soFar.size(), flag;
for(i=0;i<rest.size();++i) {
for(j=0;j<len;++j) {
flag=1;
if(soFar[j]-rest[i]==len-j || soFar[j]-rest[i]==j-len) {
flag=0; break;
}
}
if(flag) RecListNQueens(soFar+rest[i],rest.substr(0,i)+rest.substr(i+1));
}
}
}
public:
int totalNQueens(int n) {
//ans.clear();
numofsol=0;
N=n;
string str;
for(int i=1;i<=n;++i) str.push_back(i);
RecListNQueens("", str);
return numofsol;
}
};

// hdu 2553, 15ms

#include <cstdio>
#include <vector>
#include <algorithm> class countNQueenSol {
static const int MAXN=12;
static int values[MAXN];
static int occupied[MAXN];
static std::vector<int> ans;
static int cnt, rownum; static bool isSafe(int val, int row) {
for(int i=0;i<row;++i) {
if(val-values[i]==row-i || val-values[i]==i-row)
return false;
}
return true;
}
static void dfs(int row) {
if(row==rownum) ++cnt;
for(int i=0;i<rownum;++i) {
if(occupied[i]==0 && isSafe(i,row)) {
values[row]=i;
occupied[i]=1;
dfs(row+1);
occupied[i]=0;
}
}
}
public:
static int getMAXN() { return MAXN; }
static int solve(int k) {
if(k<=0 || k>=countNQueenSol::MAXN) return -1;
if(ans[k]<0) {
cnt=0;
rownum=k;
dfs(0);
//if(k==0) cnt=0; // adjust anomaly when k==0
ans[k]=cnt;
}
return ans[k];
}
};
int countNQueenSol::values[countNQueenSol::MAXN]={0};
int countNQueenSol::occupied[countNQueenSol::MAXN]={0};
std::vector<int> countNQueenSol::ans(countNQueenSol::MAXN,-1);
int countNQueenSol::cnt, countNQueenSol::rownum; int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
while(scanf("%d",&n)==1 && n>0) {
printf("%d\n",countNQueenSol::solve(n));
}
return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。// p.s. If in any way improment can be achieved, better performance or whatever, it will be well-appreciated to let me know, thanks in advance.

leetcode N-Queens/N-Queens II, backtracking, hdu 2553 count N-Queens, dfs 分类: leetcode hdoj 2015-07-09 02:07 102人阅读 评论(0) 收藏的更多相关文章

  1. hdu 1082, stack emulation, and how to remove redundancy 分类: hdoj 2015-07-16 02:24 86人阅读 评论(0) 收藏

    use fgets, and remove the potential '\n' in the string's last postion. (main point) remove redundanc ...

  2. HDU 1272 小希的迷宫(并查集) 分类: 并查集 2015-07-07 23:38 2人阅读 评论(0) 收藏

    Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就 ...

  3. one recursive approach for 3, hdu 1016 (with an improved version) , permutations, N-Queens puzzle 分类: hdoj 2015-07-19 16:49 86人阅读 评论(0) 收藏

    one recursive approach to solve hdu 1016, list all permutations, solve N-Queens puzzle. reference: t ...

  4. my understanding of (lower bound,upper bound) binary search, in C++, thanks to two post 分类: leetcode 2015-08-01 14:35 113人阅读 评论(0) 收藏

    If you understand the comments below, never will you make mistakes with binary search! thanks to A s ...

  5. hdu 1053 (huffman coding, greedy algorithm, std::partition, std::priority_queue ) 分类: hdoj 2015-06-18 19:11 22人阅读 评论(0) 收藏

    huffman coding, greedy algorithm. std::priority_queue, std::partition, when i use the three commente ...

  6. hdu 1052 (greedy algorithm) 分类: hdoj 2015-06-18 16:49 35人阅读 评论(0) 收藏

    thanks to http://acm.hdu.edu.cn/discuss/problem/post/reply.php?action=support&postid=19638&m ...

  7. hdu 1036 (I/O routines, fgets, sscanf, %02d, rounding, atoi, strtol) 分类: hdoj 2015-06-16 19:37 32人阅读 评论(0) 收藏

    thanks to http://stackoverflow.com/questions/2144459/using-scanf-to-accept-user-input and http://sta ...

  8. A simple problem 分类: 哈希 HDU 2015-08-06 08:06 1人阅读 评论(0) 收藏

    A simple problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...

  9. 多校3- RGCDQ 分类: 比赛 HDU 2015-07-31 10:50 2人阅读 评论(0) 收藏

    RGCDQ Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practic ...

随机推荐

  1. 关于input内容监听(change)

    js的话利用input的onchange事件 而jquery的话利用change()函数,代码如下: <!DOCTYPE html> <html> <head> & ...

  2. CSS 笔记六(Image/Attribute Selectors)

    Image Opacity / Transparency The CSS opacity property is a part of the CSS3 recommendation. Example ...

  3. 转 java中的session

    书中讲:以下情况,Session结束生命周期,Servlet容器将Session所占资源释放:1.客户端关闭浏览器2.Session过期3.服务器端调用了HttpSession的invalidate( ...

  4. Prince2的七大原则(7)

    [Prince2科普]Prince2的七大原则(7) 2016-12-12 光环组织级项目管理 按照惯例我们先来回顾一下,PRINCE2七大原则分别是指:持续的业务验证,经验学习,角色与责任,按阶段管 ...

  5. placeholder兼容ie8

    <script type="text/javascript">     if( !('placeholder' in document.createElement('i ...

  6. double函数和int函数

    可以看到,当tensor全是double型时,int函数会把所有元素取整,从1.5可以看出,不是四舍五入,而是取整.double函数又把整数型元素变成double型. th> a 0.0000 ...

  7. 【leetcode❤python】 400. Nth Digit

    #-*- coding: UTF-8 -*- class Solution(object):    def findNthDigit(self, n):        ""&quo ...

  8. 【转】CentOS下载版本介绍

    官网:http://www.centos.org/ 下载:http://mirror.neu.edu.cn/centos/6.6/isos/ 系统运维:http://www.osyunwei.com/ ...

  9. 【Android】设置 LinearLayout 的样式

    前言 LinearLayout是最常用的控件之一,主要是用来进行排版布局,本人介绍如何给LinearLayout 增加边框样式,在增加样式之前的效果如下: 可以看得出来,每个LinearLayout几 ...

  10. 关于js执行顺序

    http://www.cnblogs.com/sanshi/archive/2011/02/28/1967367.html http://mtnt2008.iteye.com/blog/701981 ...