hdu 2553 N皇后问题

N皇后问题

这是第一次写DFS的问题,原来是会一点,但是现在忘得有点干净,重新看了看这八皇后的问题,当然,重新理解的时候依然遇到一些问题,参考了他人的博客@https://www.cnblogs.com/chenchengxun/p/3759278.html

题目:

 

思路:这道题就是一个常见的DFS的问题。要求是每个皇后不能同时出现在同一行,同一列,同时,斜着也不行。由于是一行一行的放,所以不用考虑行的重复,列也好解决。但是,关键在于斜着的问题所以,我们可以分开讨论,左斜和右斜。

首先是左斜:

0  1  2  3   4

-1  0  1  2  3

-2 -1  0  1  2

-3 -2 -1  0  1

-4 -3 -2 -1  0

我们可以观察到,列 - 行 的差是相等的。

然后再观察下右斜:

0 1 2 3 4

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7

列 + 行 的和是相等的。

由此,大规律我们已经发现了,只需按照DFS写出即可。

#include<iostream>
#include<cstring>
using namespace std;
int sum,n, pan[3][50];
int p[50];

void DFS(int row){

    int i;
    if (row == n + 1){
        sum++;
        return;

    }
    for (i = 1; i <= n; i++){
        if (pan[0][row - i + n] == 0 && pan[1][i] == 0 && pan[2][row + i] == 0){
            pan[0][row - i + n] = pan[1][i] = pan[2][row + i] = 1;
            DFS(row + 1);
            pan[0][row - i + n] = pan[1][i] = pan[2][row + i] = 0;
        }
    }
}

int main(){

    for (n = 1; n <= 10; n++){
        memset(pan, 0, sizeof(pan));
        sum = 0;
        DFS(1);
        p[n] = sum;
    }
    while (cin >> n&&n){
        cout << p[n] << endl;
    }
    
    system("pause");
    return 0;
}

 

posted @ 2020-02-15 20:20  PCDL&TIPO  阅读(100)  评论(0编辑  收藏  举报