八皇后问题

来源:互联网 发布:而良人未之知也 编辑:程序博客网 时间:2024/04/28 16:14

题目大意:

经典的八皇后问题,即在一个8*8的棋盘上放8个皇后,使得这8个皇后无法互相攻击( 任意2个皇后不能处于同一行,同一列或是对角线上),输出所有可能的摆放情况。

基本思路:

用一维数组存储,下标代表行,元素存储列的编号,在编程时只需比较列以及对角线是否符合规则即可,判断对角线是否符合规则时注意绝对值;下面是最简单的递归算法;

代码如下:

#include <iostream>
using namespace std;


int c[20],n=8,cnt=0;
void print()
{
    for(int i=0; i<n; ++i)
    {
        for(int j=0; j<n; ++j)
        {
            if(j == c[i]) cout<<"1 ";
            else cout<<"0 ";
        }
        cout<<endl;
    }
    cout<<endl;
}
void search(int r)
{
    if(r == n)
    {
        print();
        ++cnt;
        return;
    }
    for(int i=0; i<n; ++i)//循环这一点要掌握
    {
        c[r] = i;//放在循环里保证第r+1个皇后尝试每一种可能;
        int ok = 1;
        for(int j=0; j<r; ++j)//判断跟之前的皇后是否有冲突;
            if(c[r]==c[j] || r-j==c[r]-c[j] || r-j==c[j]-c[r])
            {
                ok = 0;
                break;
            }
        if(ok) search(r+1);
    }
}
int main()
{
    search(0);
    cout<<cnt<<endl;
    return 0;
}


0 0
原创粉丝点击