N皇后问题(8皇后问题)_经典DFS_详细注释

 【递归入门】n皇后 问题(原始的8皇后问题)

时间限制: 1 Sec  内存限制: 128 MB
 

题目描述

       会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 

 

输入

一个整数n( 1 < = n < = 10 ) 

输出

每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。如果一组可行方案都没有,输出“no solute!”

样例输入

4

样例输出

2 4 1 3
3 1 4 2

AC代码:

#include<iostream>
#include<math.h>
using namespace std;

int n; //N*N棋盘及皇后的个数

int pos[105] = {0};  //存放每行皇后的列值。若pos[i]的值t,表示第i行皇后所在的列为t

bool flag = false; //是否有解的标志

void dfs(int x)  //x表示第x行皇后,每次递归表示放置第x个(行)皇后
{
    if (x == n + 1) //满足状态,输出每行皇后所在的列
    {
        flag = true;
        for (int i = 1; i <= n; i++)
        {
            if (i > 1)cout << " ";
            cout << pos[i];
        }
        cout << endl;
        return;
    }

    for (int i = 1; i <= n; i++)  //将X皇后试着放置在每一列(i列)
    {
        pos[x] = i;
        bool conf = true;  //是否与其它皇后冲突的标志
        
        for (int j = 1; j < x; j++) //遍历与之前放置的皇后是否冲突
        {
            if (i == pos[j] || x - j == abs(i - pos[j]))   //因为递归的时候已保证不同行,所以只需判断是否同列或者是否在主对角线与副对角线。条件可画图好好体会
            {
                conf = false;
                break;
            }
        }
        if (conf)dfs(x + 1);   //若不冲突,继续放置下一个皇后
    }

}
int main()
{
    cin >> n;
    dfs(1);
    if (!flag)cout << "no solute!" << endl;
    return 0;
}

PS:可提前打表

猜你喜欢

转载自blog.csdn.net/weirdo_coder/article/details/88721093