`

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-2000-2099.rar_hdu

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

    搜索算法讲座资料~~~~~

    n皇后问题位运算版.mht Search in a Graph.mht STL in Searching.mht USACO搜索策略.mht 递归分治课件 - from tju.ppt 浅谈部分搜索+高效算法在搜索问题中的应用.doc 深度优先搜索-bylove8909.doc 搜索基础.pdf 搜索...

    杭电1051到1098 acm解题报告

    - 1086——1.cpp: 可能是关于回溯法的题目,用于解决如八皇后问题、N皇后问题、数独等。 4. **树与图的深度优先搜索(DFS)与广度优先搜索(BFS)** - 1088.cpp: 可能需要使用DFS或BFS来遍历树或图,解决树的...

    杭电acm题目解答

    这些算法常用于解决组合优化问题,如八皇后问题、N皇后问题等。 2048题可能涉及到数值计算、模拟或者组合博弈论。这些题目可能需要选手对数学模型有深入理解,并能用程序准确地模拟现实情况。 2049题和2050题可能...

    HDOJ2051-2099 acm的AC解题报告

    8. **回溯法**:对于一些组合优化问题,如八皇后问题、N皇后问题、括号生成等,可能会用到回溯法来穷举所有可能的解。 9. **分治法**:对于复杂问题,分治法是一种有效的策略,如快速排序、归并排序、大数乘法等。 ...

    杭电算法18、19分析试卷.zip

    5. **搜索算法**:深度优先搜索(DFS)和广度优先搜索(BFS)是图和树问题中的常用方法,也可能涉及回溯法和剪枝策略,用于解决组合优化问题如八皇后问题、N皇后问题等。 6. **字符串处理**:如KMP算法、Boyer-...

Global site tag (gtag.js) - Google Analytics