zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    IDirect3DDevice9::SetTexture的stage参数
    c++ 返回对象的引用要小心
    c++ 头文件循环引用解法
    Real-Time Rendering.3rd,Radiance与距离无关 的解释
    0xffff0000颜色表示
    signed distance field 算法
    c++ abs与fabs
    unity, OnTriggerEnter2D不触发
    unity, particle play once and destroy
    装机人员工具
  • 原文地址:https://www.cnblogs.com/pcdl/p/12313457.html
Copyright © 2011-2022 走看看