C语言求解:8皇后问题 5C

8皇后问题:要在8×8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能相互吃掉。规则是皇后能吃同一行同一列同一对角线的任意棋子。求所有的解。
8皇后问题推广:要在n×n的国际象棋棋盘中放n个皇后,使任意两个皇后都不能相互吃掉。规则是皇后能吃同一行同一列同一对角线的任意棋子。求所有的解。

4个回答

感觉这就是在玩数独啊。

qq_36737629
qq_36737629
大约 3 年之前 回复

这是一道经典的回溯算法题
网上有各种语言 很多例子
http://blog.csdn.net/u014082714/article/details/44901575

http://blog.csdn.net/a304672343/article/details/8029122

qq_36737629
qq_36737629 回复kun_hello:找了各种版本,看不懂就算了,还几乎都有error
大约 3 年之前 回复
kun_tostudy
kun_hello 回复qq_36737629: 其实我也不知道,不过你有这心思,百度上应该的各种版本都已经找到了吧
大约 3 年之前 回复
qq_36737629
qq_36737629 我看了,你这是c++,而且代码有error,dev C++编译都通不过
大约 3 年之前 回复

for (i[1] = 0; i[1] < 8; i[1]++)
{
for (i[2] = 0; i[2] < 8; i[2]++)
{
for (i[3] = 0; i[3] < 8; i[3]++)
{
for (i[4] = 0; i[4] < 8; i[4]++)
{
for (i[5] = 0; i[5] < 8; i[5]++)
{
for (i[6] = 0; i[6] < 8; i[6]++)
{
for (i[7] = 0; i[7] < 8; i[7]++)
{
for (i[8] = 0; i[8] < 8; i[8]++)
{
//先假设这个组合是成功的,然后试图推翻
Boolean flag = true;

                                    //注意课程中这个双循环嵌套的编程逻辑是如何演变而来的
                                    for (int m = 1; m < 8; m++)
                                    {
                                        if (flag == false) { break; }//这一句在这里很重要,如果没有他,程序可能会多做几十倍的工作

                                        for (int n = m + 1; n <= 8; n++)
                                        {
                                            if (i[m] == i[n] || Math.Abs(i[m] - i[n]) == n - m) { flag = false; break; } //这一句可以减少程序50%以上的工作量
                                        }
                                    }
                                                                            }
qq_36737629
qq_36737629 能写详细注释么?
大约 3 年之前 回复
 #include<iostream>
using namespace std;
static int gEightQueen[8] = { 0 }, gCount = 0;
void print()//输出每一种情况下棋盘中皇后的摆放情况
{
    for (int i = 0; i < 8; i++)
    {
        int inner;
        for (inner = 0; inner < gEightQueen[i]; inner++)
            cout << "0";
        for (inner = gEightQueen[i] + 1; inner < 8; inner++)
            cout << "";
        cout << "#" << endl;
    }
    cout << "==========================\n";
}
int check_pos_valid(int loop, int value)//检查是否存在有多个皇后在同一行/列/对角线的情况
{
    int index;
    int data;
    for (index = 0; index < loop; index++)
    {
        data = gEightQueen[index];
        if (value == data)
            return 0;
        if ((index + data) == (loop + value))
            return 0;
        if ((index - data) == (loop - value))
            return 0;
    }
    return 1;
}
void eight_queen(int index)
{
    int loop;
    for (loop = 0; loop < 8; loop++)
    {
        if (check_pos_valid(index, loop))
        {
            gEightQueen[index] = loop;
            if (7 == index)
            {
                gCount++, print();
                gEightQueen[index] = 0;
                return;
            }
            eight_queen(index + 1);
            gEightQueen[index] = 0;
        }
    }
}
void main(int argc, char*argv[])
{
    eight_queen(0);
    cout << "total=" << gCount << endl;
    system("pause");
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问