C - 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

     建立一个n行n列的矩阵,矩阵中能放n个皇后,任意两个皇后不能再同一行或者同一列,任意两个皇后的连线不能与边界成∠45°

     问有多少种排列方法

分析:根据要求可以推出每一行每一列都至少有一个皇后

   用搜索寻找第x行的皇后放在哪一列上了,标记上这个位置,同时把其他不能放的位置也都标记下

   最后一行找完之后进入第dfs(n+1),这个时候方法数加一

代码:

/*
    注意:1:写死循环要么注意跳出条件,要么就别写
          2: 复制粘贴的前面用的代码的时候一定记得把所有需要修改的条件都改了
*/

#include <stdio.h>
#include <string.h>
using namespace std;
int cnt, n;
int vis[11][11];

void dfs(int x)
{
    if(x == n+1)
    {
        cnt++;
        return;
    }
    for(int i = 1; i <= n; i++) ////////////////////////////////////////
    {
        if(!vis[x][i])
        {
            for(int j = x; j <= n; j++)
            {
                vis[j][i]++;
            }
            for(int j = 1; 1; j++)
            {
                if(x+j <= n)
                {
                    if(i+j <= n)
                        vis[x+j][i+j]++;
                    if(i - j >= 1)
                        vis[x+j][i-j]++;
                }
                else
                    break;//////////////////////////////////////////////////////
            }
            dfs(x+1);
            for(int j = x; j <= n; j++)
                vis[j][i]--;
            for(int j = 1; 1; j++)
            {
                if(x+j <= n)
                {
                    if(i+j <= n)
                        vis[x+j][i+j]--;
                    if(i - j >= 1)
                        vis[x+j][i-j]--;
                }
                else
                    break;/////////////////////////////////////////////////////////////////
            }
        }
    }
}
int main()
{
    int ans[11], i;
    memset(ans, 0, sizeof(ans));
    for(i = 1; i <= 10; i++)
    {
        n = i;
        cnt = 0;
        memset(vis, 0, sizeof(vis));
        dfs(1);
        ans[i] = cnt;
        //printf("ans[%d] = %d\n", i, ans[i]);
    }
    while(scanf("%d", &n), n)
        printf("%d\n", ans[n]);
    return 0;
}
时间: 2025-01-08 02:39:07

C - N皇后问题(搜索)的相关文章

[ An Ac a Day ^_^ ] hdu 2553 N皇后问题 搜索

曾经想过一天一AC 坚持下来的确不容易额 (我是没坚持下来 尽量以后坚持…… 经典的N皇后问题 搜索的入门问题 学了这么久竟然一直没敲过 今天敲一下…… 这道题也不是很简单额 纯暴力就超时了 要打一下表…… 而且有一个小的优化 每次判断是否合理不用铺满图再判断 只需要判断当前放皇后的位置的上方 左上和右上有没有皇后就可以了 自己想也不好想-_-|| 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm>

HDU 2553 N皇后问题 (搜索DFS)

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

N皇后问题 --搜索

题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳棋放置的一个解.请编一个程序找出所有跳棋放置的解.并把它们以上面的序列方法输出.解按字典顺序排列.请输出前3个解.最后一行是解的总个数. //以下的话来自usaco官方

八皇后(c++启发式函数求解)

八皇后问题是回溯算法的典型案例,在回溯法中,常常是盲目搜索,耗费过多的搜索时间.在本次实验中,使用了启发式搜索,搜索时不是任取一个分支,而是选择最佳的分支往下搜索.通过定义状态空间.操作规则.搜索策略,我们可以清晰快速地得到原问题的一个解. 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.通过计算机编程,我们可以快速地求出问题的解. 状态空间 (i,C

BZOJ 1087 互不侵犯King (位运算)

题解:首先,这道题可以用位运算来表示每一行的状态,同八皇后的搜索方法,然后对于限制条件不相互攻击,则只需将新加入的一行左右移动与上一行相&,若是0则互不攻击,方案可行.对于每种方案,则用递推来统计,将前一排所有可以的情况全部加上即可.bit数组记录每个数字二进制位中1的个数,方便计算. if(check(j,q))f[i][j][k]+=f[i-1][q][k-bit[j]]; #include <iostream> #define rep(i,n) for (int i=0;i<

kb-01-a&lt;简单搜索--dfs八皇后问题变种&gt;

题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域,

棋盘问题 dfs分层搜索(n皇后变式)

棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47960   Accepted: 23210 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示

搜索6--noi1700:八皇后问题

搜索6--noi1700:八皇后问题 一.心得 二.题目 1756:八皇后 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(

搜索5--noi1700:八皇后问题

搜索5--noi1700:八皇后问题 一.心得 二.题目 1700:八皇后问题 查看 提交 统计 提问 总时间限制:  10000ms 内存限制:  65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和格式输出所有八皇后问题的解(见Sample Output). 样例输入 样例输出 No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0