八皇后问题

八皇后问题的数学模型:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。

回溯法:解决8queen问题的最简单的思路就是回溯。

  回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
1、定义一个解空间,它包含问题的解。
2、利用适于搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
  问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。
  适用范围:适用于那些不存在简明的数学模型以阐明问题的本质,或者存在数学模型,但是难于实现的问题。
 
  采用回溯法解决queen8问题:
  我们用试探的方法先对问题做一个初步的解释:
  不断的向前试探,但是到第五列的时候,已经找不到一个满足条件的位置了。此时就要回溯,将第五列的皇后拿掉,从当前位置继续向后寻找,即第7个位置,此时第五列仍然没有合适的位置,这时就回退到第4列,再前进一步,后退一步。。。知道找到第八列为止,即找到了一个解决方案。
 
 
  接下来是代码:

//queen8
#include<iostream>
using namespace std;
#define N 8
int y[N+];
int count;
void print();
bool check(int x);
int main()
{
count = ;
for(int i = ;i<;i++)
y[i]=;
int x = ;
while(x>)
{
y[x]++;
while((y[x]<=N) && (!check(x)))
y[x]++;
if(y[x]<=N)
{
if(x==N)
{
count++;
print();
}
else
x++;
}
else
{
y[x]=;
x--;
}
}
system ("pause");
return ;
}
bool check(int x)
{
for(int j=;j<x;j++)
if(abs(j-x)==abs(y[j]-y[x])||y[j]==y[x])
return false;
return true;
}
void print()
{
cout<<count<<endl;
for(int i = ; i<=N;i++)
{
for(int j = ;j<=N;j++)
if(j==y[j])
cout<<'x';
else
cout<<'o';
cout<<endl;
}
}

这样就找到了所有的92种解决方案:

queen8的更多相关文章

  1. 栈(stack)、递归(八皇后问题)、排序算法分类,时间和空间复杂度简介

    一.栈的介绍: 1)栈的英文为(stack)2)栈是一个先入后出(FILO-First In Last Out)的有序列表.3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的 ...

随机推荐

  1. (转载)Resin安装配置及使用教程

    Resin是一个提供高性能的,支持 Java/PHP 的应用服务器.目前有两个版本:一个是GPL下的开源版本,提供给一些爱好者.开发人员和低流量网站使用:一种是收费的专业版本,增加了一些更加适用于生产 ...

  2. apache on centos

    httpd https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-apache-startstop.html

  3. working with fitnesse wiki pages

    fitnesse提供一个简单易用的wiki创建一个web页面用于测试.测试页面有一个button,允许所有的测试在这个页面运行,因此任何人在任何时间都可以去这个页面点击这个按钮,查看测试是否通过.fi ...

  4. linux----------ab--性能测试工具

    ab.exe –n 10000 –c 100 localhost/index.php //其中-n代表请求数,-c代表并发数

  5. CSS中LI圆点样式li {list-style-type:符号名称}

    css中用list-style-type指定列表(lists)前面符号,如下: li {list-style-type:符号名称} 符号名称可用的值为: disc : CSS1 实心圆 circle ...

  6. 限制action所接受的请求方式或请求参数

    原文:http://www.cnblogs.com/liukemng/p/3726897.html 2.限制action所接受的请求方式(get或post): 之前我们在HelloWorldContr ...

  7. HTML5--div、span超出部分省略号显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. sql语句修改字段长度

    sql语句修改字段长度 alter table <表名> alter column <字段名> 新类型名(长度) 例: alter table students alter c ...

  9. c#-冒泡排序-算法

    冒泡排序(Bubble Sort) 冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后 ...

  10. LDA( Latent Dirichlet Allocation)主题模型 学习报告

    1     问题描述 LDA由Blei, David M..Ng, Andrew Y..Jordan于2003年提出,是一种主题模型,它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一 ...