N皇后放置方法种数

Description

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

Input

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

Output

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

Sample Input

1
8
5
0

Sample Output

1
92
10

解题思路:

就是考虑皇后放置的位置,对于每一行,我们需要枚举每个可以放置皇后的位置,
而且需要判断当前位置(第i行)是否满足条件,即判断这个位置是否与放置好的前i-1行的皇后的位置相冲突,
如果冲突,说明这个位置不合适;否则的话,就可以枚举下一行皇后的位置,直至第n行。

程序代码:

#include <iostream>
#include <cstdio>
using namespace std;
int a[11],n,temp;
void dfs(int k)
{
   int i,j,flag;
    if(k==n+1)
    {
        temp++;
        return ;
    }
    else
    {
        for(i=1;i<=n;++i)
        {
            a[k]=i;
            flag=1;
            for(j=1;j<k;++j)
            {
                if(a[j]==i||i-k==a[j]-j||i+k==a[j]+j)
                  {
                    flag=0;
                    break;
                  }
            }
            if(flag)
                dfs(k+1);
        }
    }

}
int main()
{
    int b[11],m;
    for(n=1;n<=10;++n)
    {
        temp=0;
        dfs(1);
        b[n]=temp;
    }
    while(scanf("%d",&m),m)
    {
        printf("%d\n",b[m]);
    }
    return 0;
}
时间: 2024-10-19 06:33:21

N皇后放置方法种数的相关文章

POJ 3239 n皇后放置问题

以前那个是8皇后问题,用的递归写法,然后这个可以求n皇后放置问题,用的纯粹数学方法--神奇! #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <list> #include <q

八皇后问题(回溯)

public class Queen {          int QUEEN_COUNT = 8;    //随便你定义几个皇后了,你可以循环产生a个到b个皇后的解     static final int EMPTY = 0;  //如果count[x][y] == EMPTY ,则可以放置皇后:反之,其正上方或斜上方必己放置皇后     int[][] count = new int[QUEEN_COUNT][QUEEN_COUNT]; //     int[] QueenIndex = 

2n皇后问题

在蓝桥杯基础训练题中,出现这样一道题目: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上.问总共有多少种放法?n小于等于8. 输入格式 输入的第一行为一个整数n,表示棋盘的大小. 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后. 输出格式 输出一个整数,表示总

N皇后问题

几句废话:这道题很经典哦! 试题描述  在N*N的方格棋盘放置N个皇,使得它们不相互攻击(即任意2个皇后不允许处在同一行,或同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种符合要求放置方法. 输入 输入中有一个正整数N≤20,表示棋盘和皇后的数量  输出 为一个正整数,表示N个皇后的不同放置方法数.  输入示例 5 输出示例 10 #include <iostream> using namespace std; #include <math.h>

2016HUAS暑假集训题1 H - N皇后问题

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

N皇后(回溯版+位运算版)

题目描述 Description 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上. 输入描述 Input Description 给定棋盘的大小n (n ≤ 13) 输出描述 Output Description 输出整数表示有多少种放置方法. 样例输入 Sample Input 8 样例输出 Sample Output 92 数据范围

N皇后( DFS,推荐)

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

hdu 2553 N皇后问题 经典搜索,DFS解法

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

杭电 2553 N皇后问题

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): 8077    Accepted Submission(s): 3603 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不