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. js setInterval

    var monitorInterval = null;    //检索cs 是否处理完成 开始: monitorInterval = setInterval(function () { CheckCS ...

  2. 设置程序集(dll)引用路径,整洁美观

    static class Program { //设置引用程序集路径 static Program() { AppDomain.CurrentDomain.SetData("PRIVATE_ ...

  3. dom4j-1.6.1.jar与dom4j-1.4.jar

    今天在上线的项目中遇到一个很奇怪的问题 File file = new File("O:/20160817/91a2cb1c-62eb-4a31-a1f6-3af8ab71782a/adi6 ...

  4. imx6Q rtl8188etv Android4.3 驱动调试记录

    vim kernel_imx/arch/arm/configs/imx6s_{yourdevice}_android_defconfig CONFIG_CFG80211=y CONFIG_MAC802 ...

  5. Hadoop笔记HDFS(1)

    环境:Hadoop2.7.3 1.Benchmarking HDFS 1.1测试集群的写入 运行基准测试是检测HDFS集群是否正确安装以及表现是否符合预期的好方法.DFSIO是Hadoop自带的一个基 ...

  6. hadoop2.0初识1.1

    1.伪分布式hdfs文件系统的搭建(单节点文件系统) 1.1.根据上节的讲解,配置主机映射.jdk和解压hadoop压缩包 1.2.配置namenode 在/opt/modules/hadoop-2. ...

  7. "Resuming debugger: error during debugging loop: TypeError: firstViewRangeElement is null"

    翻译过来:“重启调试器:错误调试期间循环:TypeError:firstViewRangeElement为空” 写了一个项目,其中使用到了上传图片的插件,在本地上传图片一切正常,发布到服务器却不正常了 ...

  8. winform开发框架之模块维护

    前言:模块维护试图解决的问题, 模块加载只用MEF的方式: MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库 ...

  9. 使用XML定制Ribbon的一点小前奏(稍微再进一步的理解XML)

    定制文档级Ribbon界面的实现思路: 1.excel的文件使用rar+xml的形式保存在本地. 2.用压缩软件打开文件,以规范的格式直接编缉或添加xml文件 3.使用excel文件时,主程序会解析x ...

  10. 简单说一下printf("%*s%s",xx,xx,xx);或printf("%*s\n",xx,xx);

    大家还记得这个例子吗 #include "public.h" int main() { ; printf("%4d\n",a); ; } 这个输出结果为:    ...