码迷,mamicode.com
首页 > 其他好文 > 详细

queen8

时间:2015-07-01 17:55:57      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

八皇后问题

  八皇后问题的数学模型:如何能够在 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种解决方案:

技术分享

queen8

标签:

原文地址:http://www.cnblogs.com/Sysphus/p/4613484.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!