qq_36737629
qq_36737629
采纳率0%
2016-12-12 08:05 阅读 1.3k

C语言求解:8皇后问题

5

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

4条回答 默认 最新

  • yeyueliulang yeyueliulang 2016-12-12 08:23

    感觉这就是在玩数独啊。

    点赞 评论 复制链接分享
  • kun_tostudy kun_hello 2016-12-12 08:26
    点赞 评论 复制链接分享
  • zhu1991_ 伯纳乌撸撸 2016-12-12 09:25

    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_34290793 伯爵-博 2016-12-16 13:59
     #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");
    }
    
    点赞 评论 复制链接分享

相关推荐