八皇后问题

开始慢慢切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; 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值