queen8

八皇后问题

八皇后问题的数学模型:如何能够在 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+1];
int count;
void print();
bool check(int x);
int main()
{
    count = 0;
    for(int i = 0;i<9;i++)
        y[i]=0;
    int x = 1;
    while(x>0)
    {
        y[x]++;
        while((y[x]<=N) && (!check(x)))
            y[x]++;
        if(y[x]<=N)
        {
            if(x==N)
            {
                count++;
                print();
            }
            else
                x++;
        }
        else
        {
            y[x]=0;
            x--;
        }
    }
    system ("pause");
    return 0;
}
bool check(int x)
{
    for(int j=1;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 = 1; i<=N;i++)
    {
        for(int j = 1;j<=N;j++)
            if(j==y[j])
                cout<<‘x‘;
            else
                cout<<‘o‘;
        cout<<endl;
    }
}

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

时间: 2024-11-10 12:05:49

queen8的相关文章

八皇后回溯计算法研究

仔细看了下百度中的回溯法介绍,这是一种非常有用的算法,大概有两种模式,一种是遍历,一种是递归. 我把这两种方法都列出来了,按网上的说法,递归效率要比遍历快很多,我这里测试是一样的,可能是网络上那些遍历法根本没优化好吧, 多遍历了很多东西. 网上并没有Delphi的原代码,我综合了各种算法,将N阶皇后的算法一并写出来了.以下是原代码,希望有意研究的朋友跟我留言: //工程文件:Queen8.dpr,以下代码在Delphi2010下编译通过. program Queen8; uses  Forms,

初级8皇后问题

初级8皇后问题,不是真正的8皇后问题,是该问题的初级条件限制:产生不同行,不同列的组合. typedef struct Spoint { int x; int y; Spoint() { x = -1; y = -1; } }; static Spoint point[8]; int Queen8(int n, int cur) { static int iCount = 0; if(cur == n) { iCount++; for(int i = 0; i < n; i++) { print

八皇后作业

public class Queen8 { public static int num = 0; //累计方案总数 public static final int MAXQUEEN = 8;//皇后个数,同时也是棋盘行列总数 public static int[] cols = new int[MAXQUEEN]; //定义cols数组,表示8列棋子摆放情况 public Queen8() { //核心函数 getArrangement(0); System.out.print("/n"

用java实现八皇后

public class Queen8 {      public static int num = 0; //累计方案总数      public static final int MAXQUEEN = 8;//皇后个数,同时也是棋盘行列总数      public static int[] cols = new int[MAXQUEEN]; //定义cols数组,表示8列棋子摆放情况      public Queen8() {         //核心函数        getArrang

八皇后(JAVA算法实现)

在学习现代软件工程构建之法这门课时,老师要求发表一篇博客,使用JAVA算法实现八皇后问题的求解.写这篇博客时,我学习了一些其他的博客,因为我常常遇到问题,自己无法解决时,向他人学习也是一种方法. 国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 我们可以逐行或者逐列来进行可行摆放方案的遍历,每一行(或列)遍历出一个符合条件的 位置,接着就到下一行或列遍历下一个棋子的合适位置,这