zoukankan      html  css  js  c++  java
  • [HDU] 2553 N皇后问题简单深搜

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=2553

    方法: 1.可以用对称的思想,即:如果N是偶数,则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和,最后再乘以2。如果是奇数,再单独计算一个在N/2+1这个位置的结果。

        2.一个皇后如果放在一个位置,要把该位置对应的行列上的位置和以该位置为起点,从左下 和 右下45读的两个方向延伸穿过的位置都设置为不可再放。

              3.在状态数中,在第i层为第i个皇后找位子其实就是在棋盘的第i行找。找不到就返回,否则修改棋盘,继续收索,直到第N层也搜索成功,此时给结果加1.

    感想:后期多看。

    代码:

    View Code
    #include<iostream>
    #include<math.h>
    #include <algorithm>
    using namespace std;
    int n;
    int table[11];
    struct Record
    {
        int row;
        int col;
    };
    bool canPlace[11][11];
    int total_sum=0;
    void usedPlace(int x,int y)
    {
        for(int i=x,j=y;i<=n&&j<=n;i++,j++)
            canPlace[i][j]=false;
        for(int i=x,j=y;i<=n &&j>=1;i++,j--)
            canPlace[i][j]=false;
        for(int i =x;i<=n;i++)
            canPlace[i][y]=false;
    }
     
    void DFSSearch( int start = 1)
    {
        if(start==n)
        {
            total_sum++;
            return;
        }
        bool t_canPlace[11][11];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                t_canPlace[i][j] =  canPlace[i][j];
        for(int i=1;i<=n;i++)
        {
            if(canPlace[start+1][i])
            {
                usedPlace(start+1,i);
                DFSSearch(start+1);
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                      canPlace[i][j] =  t_canPlace[i][j];
            }
        }
    }
    int main()
    {
        memset(table,-1,sizeof(table));
        while(scanf("%d",&n)&& n!=0)
        {
            int sum=0;
            if(table[n]==-1)
            {
                int boundary = n/2;
                total_sum=0;
                for(int i=1;i<=boundary;i++)
                {
                    memset(canPlace,true,sizeof(canPlace));
                    usedPlace(1,i);
                    DFSSearch();
                }
                sum+=total_sum*2;
                if(n%2!=0)
                {
                    total_sum=0;
                    memset(canPlace,true,sizeof(canPlace));
                    usedPlace(1,boundary+1);
                    DFSSearch();
                    sum+=total_sum;
                }
                table[n]=sum;
            }
            else
                sum = table[n];
            cout<<sum<<endl;
        }
        return 0;
    }
  • 相关阅读:
    知识点--Alzheimer disease
    基因组关联分析技术的简介
    数量遗传与植物育种—李慧慧
    windows下的python安装pysam报错
    【数据库】本地NR数据库如何按物种拆分?
    【数据库】本地KEGG数据库如何拆分子库?
    国内育种服务商
    【机器学习与R语言】13- 如何提高模型的性能?
    【机器学习与R语言】12- 如何评估模型的性能?
    【机器学习与R语言】11- Kmeans聚类
  • 原文地址:https://www.cnblogs.com/kbyd/p/3024405.html
Copyright © 2011-2022 走看看