问题:

  如何能够在 n×n 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

分析:

  这题常规的解法应该是回溯法,然而回溯法的话,要遍历所有的情况。

  这里介绍一种随机化的算法:

  我们先摆开头的几个棋子,然后剩下的棋子用回溯法来做,由于解空间树的头几层不用拿来遍历了,回溯的时候遍历的结点少了很多。

  研究标明,随机摆开头的一半略少的棋子,可以很快得得到解。当然,这个算法是只能求出一部分的解的,但是在 n 很大的时候速度比回溯法快了非常多。

  ps:回溯法是可以得到所有解的。

做法:

  先随机摆头几个棋子,这里有一个很棒的算法,参考:http://blog.csdn.net/yusiguyuan/article/details/42607681

  但是为了方便,我这里的做法是对一个数组中的所有元素做几次随机的交换。  

void randomPlace(int n, int pieces[])
{//随机摆放棋子
srand((unsigned)time(NULL));
for (int i = ; i < n; i++)
{
int a = random(n) + ;
int b = random(n) + ;
swap(pieces[a], pieces[b]);
}
}

  然后对接下来的棋子用回溯法:  

void nQueen(int n, int t, int pieces[])
{//回溯法解n后问题
if (t > n)
{
resultNumber++;//计算解的个数
for (int i = ; i <= n; i++)
{
for (int j = ; j < pieces[i]; j++)
cout << "- ";
cout << pieces[i] << " ";
for (int j = pieces[i] + ; j <= n; j++)
cout << "- ";
cout << endl;
}
cout << endl;
}
else
{
for (int i = t; i <= n; i++)
{
swap(pieces[t], pieces[i]);
if (isOK(t, pieces))
{
nQueen(n, t + , pieces);
}
swap(pieces[t], pieces[i]);
}
}
}

  这两个函数应该在LasVegas函数中调用,知道得出至少一个解:  

void LasVegas(int n, int pieces[])
{//拉斯维加斯算法:
//先随机摆前面的一些棋子,然后后面的用回溯法来解
if (n == )
{//特殊情况
cout << << endl;
}
else
{
for (int i = ; i <= n; i++)
{
pieces[i] = i;
}
while (resultNumber == )
{
//前几个摆的也要合理才行
while (!isOK(n / , pieces))
{
randomPlace(n, pieces);
}
nQueen(n, (n / )-, pieces);//随机一半略少的棋子摆放
}
} }

  代码是从n皇后问题改过来的,其中部分代码我这里就不显示出来了。

 

n皇后问题 [随机化算法,拉斯维加斯算法]的更多相关文章

  1. GMM算法k-means算法的比较

    1.EM算法 GMM算法是EM算法族的一个具体例子. EM算法解决的问题是:要对数据进行聚类,假定数据服从杂合的几个概率分布,分布的具体参数未知,涉及到的随机变量有两组,其中一组可观测另一组不可观测. ...

  2. 简单易学的机器学习算法——EM算法

    简单易学的机器学习算法——EM算法 一.机器学习中的参数估计问题 在前面的博文中,如“简单易学的机器学习算法——Logistic回归”中,采用了极大似然函数对其模型中的参数进行估计,简单来讲即对于一系 ...

  3. 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)

    一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...

  4. 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法

    原文:重新想象 Windows 8 Store Apps (31) - 加密解密: 哈希算法, 对称算法 [源码下载] 重新想象 Windows 8 Store Apps (31) - 加密解密: 哈 ...

  5. Hash散列算法 Time33算法

    hash在开发由频繁使用.今天time33也许最流行的哈希算法. 算法: 对字符串的每一个字符,迭代的乘以33 原型: hash(i) = hash(i-1)*33 + str[i] ; 在使用时.存 ...

  6. 变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/mutating-algorithms.h ...

  7. STL非变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...

  8. 【啊哈!算法】算法7:Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图 ...

  9. 【啊哈!算法】算法6:只有五行的Floyd最短路算法

            暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.         上图中有 ...

随机推荐

  1. 如何延长zencart1.5后台的登录时间而不退出

    2012-12-25 使用过zencart1.5版本的人都知道,后台登陆后,如果没有任何操作的话最长15分钟后就自动退出,这个对于后台管理是比较麻烦的.这个是zencart1.5在安全性上做的一个改进 ...

  2. Review Board的使用

    代码审核工具.先在命令行界面,进入到工程的Main目录下,然后使用命令 svn diff>yus.diff  这样就将Main里面的所有内容生成了,然后在浏览器里进入到自己的Review Boa ...

  3. jq的合成事件

    jq中有两个合成事件 hover()和toggle() 1.hover() hover方法用于模拟光标悬停事件.当光标移动到元素上时,会触发指定的第一个函数(enter),当光标移出这个元素时,会触发 ...

  4. How to spend you day ?

    如果这是你生命中的最后的一天,你该如何去过好它呢? 不要浪费你生命中的每一分,每一秒!!!

  5. Flocker 做为后端存储代理 docker volume-driver 支持

    docker Flocker https://github.com/ClusterHQ/flocker/ 文档: https://docs.clusterhq.com/en/latest/docker ...

  6. postgresql 数据库的备份和恢复 (pg_dump 和 pg_restore)

    pg_dump 用来备份数据库: pg_restore 用来恢复数据库: 备份出来的文件可以用 XZ (linux 自带的压缩工具压缩). XZ压缩最新压缩率之王 xz这个压缩可能很多都很陌生,不过您 ...

  7. 多年心愿,终于完成,热泪盈眶啊。。。Adrew NG 的 机器学习

    谢谢Andrew老师!谢谢Coursera!谢谢自己!希望这是一个好的开始!希望自己也能使用机器学习来make a better world...  

  8. SQL truncate 、delete与drop区别

    SQL truncate .delete与drop区别 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句 ...

  9. mrql初级教程-概念、使用(一)

    以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址 ...

  10. jquery中如何以逗号分割字符串_百度知道

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...