八皇后问题(回溯法)

问题描述:

  这是一个比较经典的问题,棋盘上有8x8共64个格子,要求将八个皇后放置到棋盘上,同时满足任意两个皇后不同行,不同列,并且不位于同一斜线上(45度和135度的斜线),这个问题采用的是回溯法解决的,下述代码是经过学习研究别人的代码得到。

代码如下:

#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
int position[9];
char map[9][9];
int sum=0;
bool Place(int x,int row)
{

    for(int i=1;i<row;i++)
    {
        int y=position[i];
        if(abs(x-y)==abs(row-i))                                          //如果位于同一条斜线上
            return false;
        else if(position[i]==x)                                           //如果位于同一列上
            return false;
    }
    return true;
}
void Seek(int t)
{
    if(t>8)                                                          //如果t大于8则说明8个皇后位置都已找到
    {
        sum++;                                                       //方案数目计数变量自加
        cout<<"No:"<<sum<<endl;
        for(int i=1;i<=8;i++)                                        //打印皇后的位置
        cout<<position[i]<<" ";
        cout<<endl;

        for(int i=1;i<=8;i++)
        {
            for(int j=1;j<=8;j++)
            map[i][j]='.';
        }
        for(int i=1;i<=8;i++)
        {
            int j=position[i];
            map[i][j]='A';
        }

        for(int i=1;i<=8;i++)
        {
            for(int j=1;j<=8;j++)
            cout<<map[i][j]<<" ";
            cout<<endl;
        }
    }
    else
    {
        for(int i=1;i<=8;i++)
        if(Place(i,t))
        {
            position[t]=i;
            Seek(t+1);
        }
    }
}
int main()
{
    for(int i=1;i<=8;i++)                                           //初始化存放每行皇后位置的数组
    position[i]=0;
    Seek(1);                                                        //调用寻找皇后位置的函数
    cout<<"Sum:"<<sum<<endl;
    return 0;
}

  

 

 

 

 

 

posted @ 2012-12-24 21:53  再见,少年  Views(253)  Comments(0Edit  收藏  举报