hdu2553

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553

题目

N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 7696    Accepted Submission(s): 3462

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

Author

cgf

有两种解法:

第一种没有优化的,用时间换空间。。第二种优化的,用空间换时间。。。

使用递归就要注意递归边界,否则会出现无穷递归。。。还要找到满足条件。。

第一种是从行开始搜索,然后遍历列,然后是遍历cur前面的行,是否与现在放置的皇后产生冲突。。

因为不能同行,同列,同对角线。。所以条件cur-C[cur]=j-C[j]或者cur+C[cur]=j+C[j]..可以通过行列式得出规律。。

还有就是要注意打表。。不然会超时。。。。

代码如下:

#include<cstdio>
#include<cstring>
const int maxn=100;
int n,tot,C[maxn],pos[maxn];

void  dfs(int cur,int n,int k)
{
    int i,j;
    if(cur==n) pos[k]++;
    else
    {
        for(i=0;i<n;i++)//遍历列
      {
         int ok=1;
         C[cur]=i;
         for(j=0;j<cur;j++)//遍历上面的行
           {
              if(C[cur]==C[j]||cur+C[cur]==j+C[j]||cur-C[cur]==j-C[j])
              ok=0;
           }
        if(ok)
         dfs(cur+1,n,k);
      }
    }
}

int main()
{
        int i;
        memset(C,0,sizeof(C));
        memset(pos,0,sizeof(pos));
        for(i=0;i<11;i++)
           dfs(0,i,i);
           while(scanf("%d",&n)!=EOF)
           {
               if(n==0) return 0;
               printf("%d\n",pos[n]);
           }
    return 0;
}

第二种是三个数组来进行优化。减少一重循环。。。

vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;

注意一定要最后把标记改回来。。。

代码如下

#include<cstdio>
#include<cstring>
const int maxn=100;
int n,tot,C[maxn],pos[maxn];
int vis[3][maxn];
void  Dfs(int cur,int n,int k)
{
     int i,j;
    if(cur==n) pos[k]++;
    else
    {
        for(i=0;i<n;i++)//遍历列
      {
         if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
         {
             C[cur]=i;
             vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
             Dfs(cur+1,n,k);
             vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
         }
       }
    }
}

int main()
{
        int i;
        memset(C,0,sizeof(C));
        memset(pos,0,sizeof(pos));
        for(i=0;i<11;i++)
            Dfs(0,i,i);
        while(scanf("%d",&n)!=EOF)
           {
               if(n==0) return 0;
               printf("%d\n",pos[n]);
           }
    return 0;
}

这是八皇后经典算法。。。加油。。。!!!!

hdu2553

时间: 2024-12-14 12:46:06

hdu2553的相关文章

N皇后问题 深搜+剪枝 hdu-2553

N 皇后问题在此就不多介绍了,相信CS的同学都应经清楚了,不清楚也可自行Google(听说国内用不了Google了?令人发指!).在此以一道例题为引. hdu-2553 1 #include <iostream> 2 #include <math.h> 3 using namespace std; 4 5 #define MAX 12 6 7 int n; 8 int solution_num; 9 int row[MAX]={0}; 10 int result[MAX]; 11

深搜--n皇后问题 hdu2553

遇到的问题:one之前写了八皇后,对于n皇后的对角线问题一直有问题.但是仔细都列出来找了一下规律之后觉得其实蛮简单的.关键是对角线标记数组要开大一点,避免越界.  two都对了之后结果TLE,最后在帮助下打了个表,顺利通过啦.. 思路:行不需要标记,从0循环到n-1,一种方法的递归结束条件是行循环到了n-1,只要列标记和对角线标记. #include<stdio.h> #include<string.h> #include<algorithm> #include<

hdu2553 N皇后问题

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16803    Accepted Submission(s): 7631 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出

HDU2553 N皇后问题---(dfs)

http://acm.hdu.edu.cn/showproblem.php?pid=2553 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合法的放置方法. Input 共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量:如果N=0,表示结束. Output 共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量. Sample Input 1 8 5 0

HDU2553 N皇后问题【回溯法】

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9579    Accepted Submission(s): 4314 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求

HDU2553:N皇后问题【递归】

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13024    Accepted Submission(s): 5878 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,

【HDU2553】N皇后问题

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11388    Accepted Submission(s): 5059 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,

[HDU2553]N皇后问题(DFS)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2553 题意 n<=10,输出N皇后问题的方法数. 题解 可以使用各种方法.这里使用DFS. 使用一维数组存储棋子位置.col[i]=j表示第i行的棋子放置在j列. 由于n<=10,打表10个结果在数组中即可. dfs(row)表示放置第row层(从0记)的棋子.dfs return条件是到了第n层,此时方法数++; 代码 import java.util.Scanner; public class

hdu&amp;&amp;poj搜索题题号

搜索 hdu1067 哈希 hdu1401 双向搜索 hdu1430 哈希 hdu1667 跌搜+启发式函数 hdu1685 启发式搜索 hdu1813 启发式搜索 hdu1885 状态压缩搜索 hdu2918 哈希 hdu2931 dfs+dfs hdu2977 bfs+dfs hdu3004 车马炮 hdu3085 双向bfs hdu3900 哈希 hdu4012 状态压缩搜索 hdu4634 状态压缩搜索 poj1324 状态压缩 poj2044 状态压缩 poj3131 双向搜索 poj