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
 //经典的N皇后问题
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std; int ch[][];
int n, num, result[]; 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>) ch[xx--][y]++;
xx = x; yy = y;
while(yy>) 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> && yy<=n) ch[xx--][yy++]++;
xx = x; yy = y;
while(xx<=n && yy>) ch[xx++][yy--]++;
xx = x; yy = y;
while(xx> && yy>) ch[xx--][yy--]++; for(i = ; i <= n; i++)
{
dfs(x+, i);
} //若这个皇后深搜后的结果不成功,则要返回原来的情况,八个方向都 --
xx = x; yy = y;
while(xx>) ch[xx--][y]--;
xx = x; yy = y;
while(yy>) 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> && yy<=n) ch[xx--][yy++]--;
xx = x; yy = y;
while(xx<=n && yy>) ch[xx++][yy--]--;
xx = x; yy = y;
while(xx> && yy>) ch[xx--][yy--]--;
} void init() //初始化函数
{
int i, j;
for(i = ; i < ; i++)
for(j = ; j < ; j++)
ch[i][j] = ;
} void set()
{
int i, k;
for(k = ; k <= ; k++)
{
num = ; n = k; //初始化
for(i = ; i <= k; i++)
{
init(); //初始化
dfs(, i); //继续dfs寻找
}
result[k] = num;
}
} int main()
{
set();
while(scanf("%d", &n), n)
{
printf("%d\n", result[n]);
} return ;
}

HDU 2553 N皇后问题(深搜DFS)的更多相关文章

  1. hdu 1198 Farm Irrigation(深搜dfs || 并查集)

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...

  2. hdu 2553 N皇后问题 (DFS)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  3. HDU 2553 N皇后问题 (深搜)

    题目链接 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对 ...

  4. HDU 2553 N皇后问题(详细题解)

    这是一道深搜题目!问题的关键是在剪枝. 下面我们对问题进行分析: 1.一行只能放一个皇后,所以我们一旦确定此处可以放皇后,那么该行就只能放一个皇后,下面的就不要再搜了. 2.每一列只能放一个皇后,所以 ...

  5. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  6. [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)     ...

  7. 图的遍历 之 深搜dfs

    DFS 遍历 深度优先搜索是一个递归过程,有回退过程. 对一个无向连通图,在访问图中某一起始顶点u 后,由u 出发,访问它的某一邻接顶点v1:再从v1 出发,访问与v1 邻接但还没有访问过的顶点v2: ...

  8. 深搜(DFS),Image Perimeters

    题目链接:http://poj.org/problem?id=1111 解题报告: 1.这里深搜有一点要注意,对角线上的点,如果为'.',则total不应该增加,因为这不是他的边长. #include ...

  9. 深搜(DFS),回溯,Fire Net

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2 解题报告: 这里的深搜有一点不同,就是,在深搜每一个点时,都要深搜每 ...

随机推荐

  1. Permutation Index I & II

    Given a permutation which contains no repeated number, find its index in all the permutations of the ...

  2. python小工具之读取host文件

    # -*- coding: utf-8 -*- # @Time : 2018/9/12 21:09 # @Author : cxa # @File : readhostfile.py # @Softw ...

  3. .net 运行中出现的错误解决方法记录

    1.应用程序无法启动,因为应用程序的并行配置不正确.有关详细信息,请参阅应用程序事件日志,或使用命令行sxstrace.exe工具. https://jingyan.baidu.com/article ...

  4. 关于vc++ 6.0 编译器,点打开文件时自动关闭

    装好VC++ 6.0后,点打开文件时编译器会自动关闭掉,然后在网上找到各位大神写的资料,果然是因为之前有安装vs2010冲突的缘故,然后http://download.csdn.net/source/ ...

  5. 读取文件和输入——read 脚本命令

    Linux之read命令使用 read命令: read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 1)read后面的变量var可以只有一个,也可以有多个,这时如果输入 ...

  6. AdvStringGrid 删除数据

    unit Unit6; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  7. Codeforces 332B Maximum Absurdity(DP+前缀和处理)

    题目链接:http://codeforces.com/problemset/problem/332/B 题目大意:给你n个数和一个整数k,要求找到不相交的两个长度为k的区间,使得区间和最大,输出这两个 ...

  8. 一张图来帮你理解 SOA

    SOA 曾经一度是技术领域中最难以理解的一个概念.SOA 似乎让很多人感到困惑 - 一般来讲这是由于人们认为它拥有几乎神奇的力量.事实上 SOA 只是一个很简单的概念:SOA 由诸如 C++ 和 Ja ...

  9. LeetCode691. Stickers to Spell Word

    We are given N different types of stickers. Each sticker has a lowercase English word on it. You wou ...

  10. peda的官方文档说明

    peda在github上的官方文档,摘抄过来,方便查阅. 安装 git clone https://github.com/longld/peda.git ~/peda echo "sourc ...