• hdu 2353 n皇后问题


    Problem Description
    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
    你的任务是,对于给定的N,求出有多少种合法的放置方法。

     
    Input
    共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
     
    Output
    共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
     
    Sample Input
    1 8 5 0
     
    Sample Output
    1 92 10
    搜索的题目有很多种情况
    以前的模板不是全图都搜的 这次则需要全盘的dfs
    简化要点 用一维数组来实现 数组的坐标表示行数 对应的元素值表示 该行放置皇后所在的列数
    dfs的结束条件为全部搜索完

    #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    #include<stdio.h>
    using namespace  std;
    long long a[100];
    long long sum;
    int visit(int k,int x)//行数    皇后所在的列数
    {
     int i;
     for(i=1;i<k;i++)
     {

      if(a[i]==x||(abs(k-i)==abs(x-a[i])))
      {
       return 0;
      }
     }
        return 1;
    }
    void dfs(int k,int end)//k表示行数 //  这里的dfs为到一步后  还有n步。
    {
     int i;
     if(k>end)
     {
      sum++;
      return;
     }
     for(i=1;i<=end;i++)
     {
      if(visit(k,i)==1)
      {
       a[k]=i;
       dfs(k+1,end);
      }
     }
    }
    int main()
    {
        long long sume[110],i,n;
        for(i=1;i<=10;i++)
     {
      sum=0;
      memset(a,0,sizeof(a));
      if(n==0) break;
      dfs(1,i);
      sume[i]=sum;
     }
     while(~scanf("%I64d",&n))
     {
       if(n==0) break;
       printf("%I64d ",sume[n]);
     }
     return 0;
    }

    这里对应的模板就是这样

    ///void   DFS(int k)  //处理第k步 
    {   if  (k==n)   //已经处理到第n步,到达目的状态 
                   输出结果
        else   //处理第k步
              for (int i=1; i<=m; i++)  //第k步中有m种可能
              {    处理第k步
                        DFS(k+1);//进入第k+1步
              }
    }

  • 相关阅读:
    爬虫之暴力字典生成器
    爬虫之自动生成url
    数字、大小写字母的字符编码
    对avalonjs的研究
    求墙之间有多少水洼
    2.在centos7虚拟机搭建nginx网站
    P1250 种树
    暂时用笔记
    羊村的OI题解
    P1083 借教室
  • 原文地址:https://www.cnblogs.com/z1141000271/p/5428524.html
Copyright © 2020-2023  润新知