14-n皇后

/*题目内容:

国际象棋中的皇后可以沿着水平线,垂直线,或者斜线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的
放置在棋盘上,1970年与1971年, E.W.Dijkstra与N.Wirth曾经用这个问题来讲解程式设计之技巧。
该题要求N皇后的放置结果共有多少种

输入描述

输入一个正整数N(N小于16)

输出描述

输出结果
输入样例
8

输出样例
92
*/

#include <iostream>
#include <algorithm>
using namespace std;
int hou[100]; //第i行 hou[i]列
int n = 0;
int c = 0;

int fun(int k){    //摆放第k行皇后,并且0到K-1行皇后已经放好了
    if(k == n){    //说明已经放好了n个皇后,则结束一种
//        for(int i = 0; i < n; i++)
//            cout << hou[i] + 1 << " ";
//        cout << endl;
        c++;
        return 1;
    }
    for(int i = 0; i < n; i++){ //检测每一列  //为什么是到N,不应是到八吗??
        int j = 0;
        for(j = 0; j < k; j++){ //一行一行的看是否与前面的皇后冲突
            if(hou[j] == i || abs(hou[j] - i) == abs(j - k))
                break;
        }
        if(j == k){
            hou[k] = i;
            fun(k+1);
        }
    }
}

int main(){
    cin >> n;

fun(0);
    cout << c;    
    return 0;
}

时间: 2024-08-26 08:47:12

14-n皇后的相关文章

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I

HDU - 2553 N皇后问题(dfs)

题意:每行放一个棋子,棋子不能在同一行同一列,对角线. 这道题关键在剪枝.剪枝完了就是递归咯. 剪枝: (a[i]数组里面装选择的列). 某一行的a[i]不能和a[n]冲突,所以有以下4个需要判断的条件: a.行与行之间不能冲突,但是因为我们就是每一行求一个皇后位置,所以肯定不会冲突,不需要考虑啦. b.列与列直接不能冲突,a[n]!=a[i]. c.不在同一对左角线,a[n]-a[i]!=n-i. d.不在同一对右角线,a[n]-a[i]!=-(n-i). 然后c和d合并一下就是abs(a[n

关于八皇后问题

八皇后问题主要是关于实现递归程序方面的知识. 问题描述: 会下象棋的人都知道:皇后可以在横竖,斜线上不限步数的吃掉其他棋子,如何将八个皇后放在棋盘上,使他们谁都不被吃掉,这就是著名的八皇后问题.对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2....b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题有92组解.求出八皇后问题的所有解. 解题思路: 使用8*8矩阵作为模拟棋盘,以每一行为单位进行选择放置皇后,在放置皇后的同时将放置的皇后的控制范围画出,在

8皇后及其普及(N)——小试牛刀(1)

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻 击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出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皇后问题(详细题解)

这是一道深搜题目!问题的关键是在剪枝. 下面我们对问题进行分析: 1.一行只能放一个皇后,所以我们一旦确定此处可以放皇后,那么该行就只能放一个皇后,下面的就不要再搜了. 2.每一列只能放一个皇后,所以我们下次搜索就不要再搜已经放过的皇后了. 3.斜的45°线也只能放一个. 综上如何才能最快速的确定一列和45°是否用过这个是个关键步骤,一旦此步骤确定我们就可以很快的进行搜索了. 我们用三个数组来保存他的每一个状态及(三个方向 ↑ ) 但是如果我们保存↑(每一列方向上的皇后)是非常容易保存的 但是保

洛谷 P1219 八皇后 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1219 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 行号 1 2 3 4 5 6 列号 2 4 6 1 3 5 这只是跳

python学习八皇后问题

1 import random 2 #冲突检查,在定义state时,采用state来标志每个皇后的位置,其中索引用来表示横坐标,基对应的值表示纵坐标,例如: state[0]=3,表示该皇后位于第1行的第4列上 3 def conflict(state, nextX): 4 nextY = len(state) 5 for i in range(nextY): 6 #如果下一个皇后的位置与当前的皇后位置相邻(包括上下,左右)或在同一对角线上,则说明有冲突,需要重新摆放 7 if abs(stat

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

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

0-1背包问题与N皇后问题的纠结

昨日同学要我帮他看一道算法,如下: 是不是乍一看是“0-1背包”问题呀,我也这么想,于是就这么兴致勃勃的开始用这个想法去思考怎么算.但是算法也忘得差不多,回去赶紧补补,也趁着这次机会好好复习一下算法,于是觉得“0-1背包”问题实现了,这个问题也差不多了吧: /***********************0-1背包*************************************/ 1 //先将那两个条件忽略,单纯利用动态规划 -------------------这里就看出有多傻-—_