八皇后-采用排列的方法做的

题意:求八皇后的摆法


显然8个皇后肯定是不能在同一行的,因此只需要考虑8个皇后列的摆法,使用数组ColumnIndex[8],数组中第i个数字表示位于第i行的皇后的列号。首先对ColumnIndex使用0~7进行初始化,然后对ColumnIndex进行全排列,关于排列请看我前面写的《字符串的全排列》,之后对得到的各个排列进行判断,看是否满足条件。由于8个皇后已经是在不同的行和列上了,现在只需判断是否存在两个以上的皇后在同一条对角线上,因此判断条件为:i - j == ColumnIndex[i] - ColumnIndex[j] 或  j - i == ColumnIndex[i] - ColumnIndex[j],如上有一个成立则不满足条件

int queueNum = 0;
vector<int> queue;

void PrintQueue()
{
    cout << queueNum << " queue: ";
    for(vector<int>::iterator iiter = queue.begin(); iiter != queue.end(); iiter++)
        cout << *iiter << " ";
    cout << endl;
}

bool check()
{
    for(vector<int>::iterator iiter = queue.begin(); iiter != queue.end(); iiter++)
    {   
        for(vector<int>::iterator jiter = iiter + 1; jiter!= queue.end(); jiter++)
        {   
            if((iiter - jiter) == (*iiter - *jiter) || (iiter - jiter) == (*jiter) - (*iiter))
                return false;
        }   
    }   
    return true;
}
void Permutation(vector<int>::iterator first, vector<int>::iterator last)
{
    if(first == last)
    {   
        if(check())
        {   
            queueNum++;
            PrintQueue();
        }   
        return;
    }   

    for(vector<int>::iterator iiter = first; iiter != last; iiter++)
    {   
        iter_swap(iiter, first);
        Permutation(first + 1, last);
        iter_swap(iiter, first);
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值