本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797

题意:

  在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。

思路:

  回溯 + 剪枝,有点类似于DFS全排列。利用emp[i]表示从左往右第 i 个皇后的所在的行,从而使得所有皇后默认不在同一列。

代码:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <cstdlib>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. const int MAXN = ;
  11. int emp[MAXN]; //emp[i] 表示从左往右 第 i 个皇后所在的行
  12. int used[MAXN]; //标记这一行已经被使用
  13. int n;
  14. int cnt; //合理的解的总数
  15.  
  16. int check(int key) //判断第 key 个皇后的位置是否合理
  17. {
  18. if(used[ emp[key] ]) //判断 行 是否合理
  19. return ;
  20. for(int i = ; i < key; i++) // 判断斜着是否和合理
  21. if( abs(i - key) == abs(emp[i] - emp[key]) )
  22. return ;
  23. return ;
  24. }
  25.  
  26. void backtrack(int key)
  27. {
  28. if(key > n) //满足条件的一个解
  29. cnt++;
  30. else
  31. {
  32. for(int i = ; i <= n; i++) //第 key 列的皇后可以有放到 1 - N 行的N种选择(状态)
  33. {
  34. emp[key] = i; //把第 key 个皇后放在第 i 行
  35. if(check( key )) //合法性
  36. {
  37. used[i] = ; //标记这 行 已被使用
  38. backtrack( key + ); // 继续求解下一个皇后
  39. used[i] = ; //恢复现场
  40. }
  41. }
  42. }
  43. }
  44.  
  45. int main()
  46. {
  47. //freopen("out.txt", "w", stdout);
  48. while(cin >> n)
  49. {
  50. cnt = ;
  51. memset(emp, , sizeof(emp));
  52. memset(used, , sizeof(used));
  53. backtrack(); //从第一个皇后开始放
  54. }
  55. return ;
  56. }

HDU 2553 N皇后问题(回溯 + 剪枝)的更多相关文章

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

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

  2. HDU 2553 n皇后问题(回溯法)

     DFS Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description ...

  3. HDU 5113 Black And White 回溯+剪枝

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5113 Black And White Time Limit: 2000/2000 MS (Java/ ...

  4. HDU 2553 N皇后问题 (DFS_回溯)

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

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

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

  6. HDU 2553(N皇后)(DFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=2553 i表示行,map[i]表示列,然后用DFS遍历回溯 可以参考这篇文章: http://blog.csdn. ...

  7. hdu 2553 N皇后问题

    回溯. 一个主对角线,副对角线的技巧 //vis[0][i]表示第i列有没有皇后 vis[1][cur+i]表示副对角线 vis[2][cur-i+n]表示主对角线 #include <cstd ...

  8. hdu 2553 N皇后问题 (经典DFS)

    题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...

  9. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

随机推荐

  1. WIN8、WIN7访问Windows Server 2003服务器的数据库速度很慢、远程速度很慢的解决方法

    原因是微软在WIN7开始上加入了网络速度限制.在控制台执行以下命令即可解决: netsh interface tcp set global autotuninglevel=disabled

  2. USACO Section1.5 Number Triangles 解题报告

    numtri解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  3. vue.js中created方法作用

    这是它的一个生命周期钩子函数,就是一个vue实例被生成后调用这个函数.一个vue实例被生成后还要绑定到某个html元素上,之后还要进行编译,然后再插入到document中.每一个阶段都会有一个钩子函数 ...

  4. python - web自动化测试 - 元素操作 - 窗口切换

    # -*- coding:utf-8 -*- ''' @project: web学习 @author: Jimmy @file: 元素操作-切换.py @ide: PyCharm Community ...

  5. Elasticsearch相关度评分_score

    相关度评分 _score 的目的 是为了将当前查询的结果进行排序,比较不同查询结果的相关度评分没有太大意义. _score的计算方式 score(q,d) = # score(q,d) 是文档 d 与 ...

  6. Java 多线程(Thread)学习

    多线程:就是进程的扩展,实现并发.一个进程可以包含多个线程,进程一般是由操作系统控制,而线程就是由程序员控制的,所以作为编程人员做好线程是我们的重点. 线程和进程一样分为五个阶段:创建.就绪.运行.阻 ...

  7. spring 配置问题记录1-@ResponseBody和favorPathExtension

    在搭建springmvc+easyui的项目时,有一个地方参照网上说的方法一直没实现出来, 就是前台的datagrid的数据渲染不上去, 尝试了好多种方法,包括也找了目前手里的项目来进行比较,也没发现 ...

  8. Web 安全概念

    Web 安全概念 Web 应用中存在很多安全风险,这些风险会被黑客利用,轻则篡改网页内容,重则窃取网站内部数据,更为严重的则是在网页中植入恶意代码,使得用户受到侵害.常见的安全漏洞如下: XSS 攻击 ...

  9. java链接数据库--Mysql

    /************************************************************************* > File Name: Mysql.jav ...

  10. [codevs1746][NOI2002]贪吃的九头龙

    [codevs1746][NOI2002]贪吃的九头龙 试题描述 传说中的九头龙是一种特别贪吃的动物.虽然名字叫"九头龙",但这只是说它出生的时候有九个头,而在成长的过程中,它有时 ...