• HDU-2553


    N皇后问题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 22760    Accepted Submission(s): 10136


    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

    首先我们要知道 对于向右下45°,所有的位置有行-列相等的特性;对于向左下45°,所有位置有行+列相等的特性。上下就是列相等。

    由此,我们可以对这三个方向标记,若都不存在皇后,则该位置可行。

    注意 本题需要先打表,因为n最大仅为10,打表可以避免对于同样的询问浪费多余的时间。

    附AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n,sum;
     5 int vis[3][50],t[15];
     6 
     7 void dfs(int row){
     8     if(row==n+1){
     9         sum++;
    10         return;
    11     }
    12     for(int i=1;i<=n;i++){
    13         if(vis[0][row-i+n]==0&&vis[1][i]==0&&vis[2][row+i]==0){
    14             vis[0][row-i+n]=1;
    15             vis[1][i]=1;
    16             vis[2][row+i]=1;
    17             dfs(row+1);
    18             vis[0][row-i+n]=0;
    19             vis[1][i]=0;
    20             vis[2][row+i]=0;
    21         }
    22     }
    23 }
    24 
    25 int main(){
    26     for(n=1;n<=10;n++){
    27         memset(vis,0,sizeof(vis));
    28         sum=0;
    29         dfs(1);
    30         t[n]=sum;
    31         //cout<<n<<" "<<t[n]<<endl;
    32     }
    33     while(cin>>n&&n){
    34         cout<<t[n]<<endl;
    35     }
    36     return 0;
    37 }
  • 相关阅读:
    Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
    阿里云主机 CentOS6.5 安装Mysql php Apache
    MAC下使用feddler进行抓包
    javascript钩子之Backbone里的实现
    SASS编译
    动态代理模式和AOP探究
    二分查找算法
    MyBatis在非Spring环境下第三方DataSource设置-Druid篇
    写字节流转换String 代码示例
    SpringAOP代理报错问题
  • 原文地址:https://www.cnblogs.com/Kiven5197/p/6729790.html
Copyright © 2020-2023  润新知