`

hdu 2553 N皇后问题 (经典的dfs)

    博客分类:
  • dfs
阅读更多

N皇后问题

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


 

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
      
        又是一个经典的dfs问题!非常值得大家去学习的一条题目!想当年刚刚大一时,觉得8皇后问题非常难且复杂,但是知道了dfs这个算法后,原来这是如此的简单!!!
我的代码(有注释):
//经典的N皇后问题
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;

int ch[25][25];
int n, num, result[25];

void dfs(int x, int y)
{
    if(ch[x][y]) return;    //如果该点已经被攻击,则返回
	int i, xx, yy;
    if(x == n)  //如果
    {
        num++;
        return;
    }

    //下面个人觉得比较巧妙,因为会有重复的地方很难分析是属于哪个皇后
    //若用了下面位置的 ++ or -- ,则巧妙地避免上述情况
    //一共八个方向进行标记:上、下、左、右、左上、左下、右上、右下
    xx = x; yy = y;
    while(xx>0)  ch[xx--][y]++;
    xx = x; yy = y;
    while(yy>0)  ch[x][yy--]++;
    xx = x; yy = y;
    while(xx<=n) ch[xx++][y]++;
    xx = x; yy = y;
    while(yy<=n) ch[x][yy++]++;
    xx = x; yy = y;
    while(xx<=n && yy<=n) ch[xx++][yy++]++;
    xx = x; yy = y;
    while(xx>0  && yy<=n) ch[xx--][yy++]++;
    xx = x; yy = y;
    while(xx<=n && yy>0)  ch[xx++][yy--]++;
    xx = x; yy = y;
    while(xx>0  && yy>0)  ch[xx--][yy--]++;

    for(i = 1; i <= n; i++)
    {
        dfs(x+1, i);
    }

    //若这个皇后深搜后的结果不成功,则要返回原来的情况,八个方向都 --
	xx = x; yy = y;
    while(xx>0)  ch[xx--][y]--;
    xx = x; yy = y;
    while(yy>0)  ch[x][yy--]--;
    xx = x; yy = y;
    while(xx<=n) ch[xx++][y]--;
    xx = x; yy = y;
    while(yy<=n) ch[x][yy++]--;
    xx = x; yy = y;
    while(xx<=n && yy<=n) ch[xx++][yy++]--;
    xx = x; yy = y;
    while(xx>0  && yy<=n) ch[xx--][yy++]--;
    xx = x; yy = y;
    while(xx<=n && yy>0)  ch[xx++][yy--]--;
    xx = x; yy = y;
    while(xx>0  && yy>0)  ch[xx--][yy--]--;
}

void init()     //初始化函数
{
    int i, j;
    for(i = 0; i < 12; i++)
        for(j = 0; j < 12; j++)
            ch[i][j] = 0;
}

void set()
{
	int i, k;
	for(k = 1; k <= 10; k++)
	{
		num = 0; n = k;     //初始化
		for(i = 1; i <= k; i++)
        {
            init();         //初始化
            dfs(1, i);      //继续dfs寻找
        }
		result[k] = num;
	}
}

int main()
{
	set();
    while(scanf("%d", &n), n)
    {
        printf("%d\n", result[n]);
    }

    return 0;
}
 
1
14
分享到:
评论
3 楼 breakallerror 2011-08-02  
太暴力了
2 楼 gzhu_101majia 2011-07-31  
lazykiki 写道
暴力搜索。。。

深搜是这样的吧 
1 楼 lazykiki 2011-07-31  
暴力搜索。。。

相关推荐

    hdu acm 教案(7)

    例如,八皇后问题、N皇后问题等,都需要通过搜索所有可能的状态来找到解决方案。 4. **剪枝**:在搜索过程中,剪枝是一种优化策略,用于提前终止那些肯定不会导致解的子树的搜索。这可以显著减少搜索空间,提高效率...

    HDU题目java实现

    10. **回溯法**:在解决组合优化问题和逻辑推理问题时常用,如八皇后问题、数独求解等。 11. **数学知识**:部分题目可能需要运用到离散数学、组合数学、数论等领域的知识。 12. **数据结构**:包括栈、队列、堆、...

    解题代码 hdu1241

    ### 知识点解析 #### 一、题目背景与理解 根据给定的文件信息,我们可以得知这是一段用于解决HDU(Hdu Online Judge)编号为...综上所述,这段代码有效地解决了HDU 1241的问题,展示了DFS在解决实际问题中的应用。

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    ACM HDU题目分类

    例如,1003 DP 经典问题,最大连续子段和;1024 经典 DP,最大 M 子段和;1025 经典 DP,最长递增子序列(要用 NLogN 的方法过);1051 经典贪心,也可以用 DP;1058 经典问题,丑数,DP;1081 经典 DP 等等。 搜索...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    hdu1250高精度加法

    本题(hdu1250)主要考察的就是如何通过编程实现高精度加法,并解决一个特定的数学问题。 #### 题目解析 根据题目描述,该题目编号为HDU1250,其核心在于利用高精度加法解决问题。具体地,题目涉及到了斐波那契数列...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【描述】提到的"水仙花数"问题,是计算机科学和算法竞赛中的一个经典题目。水仙花数是指一个三位数,其每一位数字的立方和等于该数本身。例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。在ACM(国际大学生...

    hdu1290解题报告

    ### hdu1290解题报告 #### 题目背景与意义 此题作为对杭州电子科技大学五十周年校庆的献礼,通过一道趣味性的数学问题来庆祝这一重要时刻。题目背景设置在一个充满想象力的情境下,即如何通过不同数量的切刀将一个...

    ACM hdu 代码大全3000例,部分代码有详细解析

    - 回溯法:在搜索过程中遇到无效解时回退一步,常用于解决组合优化问题,如八皇后问题、数独等。 3. 数学与理论篇: - 离散数学:包括图论、集合论、组合数学等内容,为算法设计提供理论基础。 - 数论:模运算、...

    Hdu1000—2169部分代码

    下载这些代码可以帮助学习者理解如何应用编程技巧和算法来解决HDU OJ上的问题,从而提高自己的编程和算法能力。 标签"HDu acm"进一步确认了这些代码与ACM竞赛相关的编程挑战有关,可能是参赛者或训练者为了准备比赛...

    HDU算法讲解的PPT

    6. **递归与回溯**:递归是解决许多问题的有效手段,而回溯则是解决组合优化问题的经典策略,如八皇后问题、N皇后问题、数独求解等。 7. **分治与贪心策略**:这两种思想是设计算法的重要指导原则,分治将大问题...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi University,简称 HDU)在线判题系统(Online Judge,简称 OJ)上的一个问题。具体来说,这个问题是关于 "a...

    HDU-ACM课件.rar

    10. **搜索**:搜索算法包括深度优先搜索(DFS)和广度优先搜索(BFS),常用于图或树的遍历,解决迷宫问题、八皇后问题等。A*搜索是启发式搜索的一种,结合了贪婪和优先级队列,适用于有目标导向的问题。 11. **...

    HDU-2000-2099.rar_hdu

    8. **回溯与分支限界**:2301-2350号题目可能涉及这些问题,如八皇后问题、N皇后问题、排列组合等。 9. **模拟与建模**:2351-2400号题目可能需要对实际问题进行抽象,通过编写程序模拟现实世界中的过程。 10. **...

    八数码A*算法 HDU 1043

    八数码的A*算法~不是很高效,但是很适合刚刚学这个算法的朋友们

    hdu acm 教案(3)

    7. **案例分析**:教案可能会包含一些经典的动态规划问题,如背包问题、最长公共子序列、最短路径问题(如Floyd-Warshall算法),通过具体案例帮助学生理解和应用动态规划。 8. **代码实现**:讲解如何用实际编程...

    杭电ACMhdu1163

    “hdu1163”是该问题在杭电ACM平台上的唯一标识符,方便选手查找和讨论。 【详细知识点】: 1. **算法基础**:解决ACM题目,首先需要掌握基础的算法,如排序(快速排序、归并排序、冒泡排序等)、搜索(二分查找、...

    ACM HDU

    【ACM HDU】指的是在ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest)中,参赛者在杭州电子科技大学(Hangzhou Dianzi University,简称HDU)的在线评测系统上完成并已解决的题目集合...

    HDU1059的代码

    HDU1059的代码

Global site tag (gtag.js) - Google Analytics