zoukankan      html  css  js  c++  java
  • 2016HUAS暑假集训题1 H

    Description

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

    Input

    共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

    Output

    共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

    Sample Input

    1
    8
    5
    0

    Sample Output

    1
    92
    10
    分析:
    本题可以把问题转化为从64个格子中选一个子集,使得子集中恰好有8个个字且任意两个选出的给都不在同一行,同一列或同一对角线上;用c[x]表示x行皇后的列编号,则变成了全排列生成问题;
    ac代码:
    #include<stdio.h>
      #include<string.h>
    
     int n,tmp;
     int map[11];
    
     void DFS(int k)
     {
         int i,j,flag;
         if(k==n+1)//递归边界,走到这里皇后不会冲突
          {
               tmp++;
              return;
          }
          else
          {
              for(i=1;i<=n;++i)
              {
                  map[k]=i; //把第i行的皇后放到第i列
                  flag=1;
                  for(j=1;j<k;++j)     // 检查是否个前面的皇后冲突
                  {
                      if(map[j]==i||i-k==map[j]-j||i+k==map[j]+j)   
                      {
                          flag=0;
                          break;
                      }
                  }
                  if(flag)               //如果合法  则继续递归
                     DFS(k+1);
              }
          }
      }
    
      int main()
      {
          int i,m;
          int ans[11];
         for(n=1;n<=10;++n)
         {
              tmp=0;
             DFS(1);
              ans[n]=tmp;
          }
          while(scanf("%d",&m),m)
          {
              printf("%d
    ",ans[m]);
          }
          return 0;
      }
    

      

     
  • 相关阅读:
    java工程师面试总结
    多线程面试题
    冒个泡
    给大家简单介绍一下:Elasticsearch
    单点登录
    (jQuery)Cookie记住用户名和密码
    我们需要循序渐进的代码重构
    Java序列化(Serialization)的理解
    Java对象序列化
    【武】做一个有自控力的人,开始你的时间规划吧!
  • 原文地址:https://www.cnblogs.com/LIUWEI123/p/5676847.html
Copyright © 2011-2022 走看看