八皇后问题

开始慢慢切acm题,有空就切一些吧,慢慢练算法

zoj的1002,是一个八皇后问题的变种,恰好上次卓卓也和我说过八皇后问题

索性就好好学习一下这个题的解决方案吧

自己折腾了一下,最后还是参考了网上的现成答案,罪过罪过,没怎么经脑子啊

以后要自己多动脑子,不废话,入正题。

八皇后问题,详情不解释,不知者百度之



        首先是,存储八皇后地址的数据结构,还是一个一维数据结构比较好用。数组下标表示棋盘的第几行,相应下标所记录的值表示皇后在第几列。判断两个皇后是否在一列上是比较方便的了,对比其列值即可。判断是否在同一斜线上也很简单,详情见代码了。

        使用的方式还是递归回溯。这个比较简单了递归到最后一行的时候,记录一下。代码比较简单,一看就能看懂。

#include <iostream>
#include <cmath>
using namespace std;


int Count;
bool isOk(int *arr, int i)
{
    for(int k=1;k!=i;k++)
        if(arr[i] == arr[k] || abs(i-k) == abs(arr[i] - arr[k]))
            return false;
    return true;
}


void Queen(int *arr, int i, int n)
{
    /* 尝试着在第i行的第j列放置一个皇后。*/
    for(int j=1;j!=n+1;j++)
    {
        arr[i] = j;//如果下面判断为false,则之后的循环会将其覆盖之 
        if(isOk(arr,i))
        {
            //到第n行,就说明判定结束了,这是一种可行方案
            if(i == n)
                Count++;
            else
                Queen(arr,i+1,n);
        }
    }
}


int main()
{
    int N;
    Count = 0;
    cout<<"Please input the number of the queen:";
    cin>>N;
    int *arr = new int[N+1];
    Queen(arr,1,N);
    
    cout<<"总共有"<<Count<<"种排列方式";
    system("pause");
    return 0; 
}


你可能感兴趣的:(八皇后问题)