八皇后问题

Posted little77

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后问题相关的知识,希望对你有一定的参考价值。

刚开始学习c++,代码有什么问题还欢迎各位指出

//通过修改宏可以解决n皇后的问题
#define MAX 8
#define ABS(x) ((x>0)?(x):-(x))
class Queen
{
private:    
    int queen[MAX] ;
public:
    Queen();
    int Place(int);
    int Attack(int, int);
    int OutData();
    ~Queen();
};
Queen::Queen()
{
    //for (int i = 0; i < MAX; i++)queen[i] = 0;
    std::cout << "hello,welcome to eight Queen ";
    Place(0);

}
//排列下一个皇后
int Queen::Place(int p)
{
    for (int i = 0; i < 8;i++)
    {
        if (!Attack(p, i))
        {
            queen[p] = i;            
            if (p == MAX - 1) OutData();
            else
            {
                Place(p + 1);
            }
        }
        
    }
    return 0;
}
//判断是否收到攻击,受到攻击返回1,否则返回0
int Queen::Attack(int row, int col)
{
    int flag = 0;
        //i<row可以保证不在同一行
    for (int i = 0; i < row && !flag; i++)
    {
        int inc_row = ABS(i - row);
        int inc_col = ABS(queen[i] - col);
                //判断是否在同一列,是否在斜线上
        flag = (col == queen[i]) || (inc_col == inc_row);
    }
    return flag;
}

int Queen::OutData()
{
    for (int i = 0; i < MAX; i++)
    {
        for (int j = 0; j < MAX; j++)
        {
            if (j == queen[i])std::cout << "Q";
            else std::cout << "-";
        }
        std::cout << "\n";
    }
    getchar();
    return 0;
}

Queen::~Queen()
{
    std::cout << "end" << std::endl;
}
int main()
{
    Queen a;
    return 0;
}
    

调试的时候会有一个问题,一直输出结果,经过仔细查看代码看出,由于递归调用,可以输出所有种类的结果,所以得对结果加以区分,加入getchar是为了输出一个结果

以上是关于八皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

八皇后,回溯与递归(Python实现)

基于WPF的八皇后简单应用程序

八皇后问题的遗传算法解法,c语言编写

八皇后问题

八皇后

八皇后问题