n皇后问题 c++

Posted

tags:

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

试题描述

在一个国际棋棋盘上,放置n个皇后(n<10),使她们相互之间不能进攻。求出所有布局。

输入要求

一个自然数n,表示n个皇后。

输出要求

每行输出一种方案,每种方案顺序输出皇后所在的列号,每个数之间用空格隔开。

输入样例

4

输出样例

2 4 1 3
1 3 4 2

void queen(int n,int k,int pos[])
    if(k==n)
        for(int i=0;i<n;++i)
            std::cout<<(pos[i]+1)<<" "<<std::ends;
        std::cout<<std::endl;
    else
        for(int i=0;i<n;++i)
            if(ok(k,i,pos))
                pos[k]=i;
                queen(n,k+1,pos);
            
        
    

bool ok(int rRow,int rPos,int pos[])
    for(int i=0;i<rRow;++i)
        if(pos[i]==rPos)return false;
        if(abs(pos[i]-rPos)==(rRow-i))return false;
    
    return true;

int main()
    int n=8;
    int pos[n];
    queen(8,0,pos);
    return 0;
参考技术A

简单遗传算法求解n皇后问题

八皇后问题

刚开始学习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是为了输出一个结果

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

n皇后问题(C语言 回溯算法)

n皇后问题(C语言 回溯算法)

DFS-回溯与剪枝-C - N皇后问题

基于C语言的n皇后问题

Lua实现的八皇后问题

八皇后问题求解的C语言程序的实现