DFS

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

 

Description

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

 

Input

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 

Sample Input

1
8
5
0
 

Sample Output

1
92
10
 
 
 
 
题解:此题采用的是递归枚举法(回溯法)。本题采用逐行放置。要预先把合法的放置方法数保存起来
设皇后的编号依次为1,2,……,n,则可以认为第i个皇后必须摆放在第i行,然后枚举第一个皇后的位置进行回溯,若某一次发现某个皇后无法找到摆放位置则直接返回,如果所有皇后都可以找到摆放位置,则说明存在一种摆法满足要求,统计有多少种摆法即可。
思路:每行最多只能有一个皇后,所以用a[ ]表示行向量,搜索从第一个行向量开始
按行向量递增搜索,一直到最后一个行向量结束时得到一种放置方法,用b[]保存摆法。

 
AC代码:
  1. #include<stdio.h>
  2. #include<cstring>
  3. int vis[][];
  4. int c[];
  5. int cur,tot;
  6. int n;
  7. void search(int cur)
  8. {
  9. if(cur==n)
  10. tot++;
  11. else for(int i=; i<n; i++)
  12. {
  13. if(!vis[][i]&&!vis[][cur+i]&&!vis[][cur-i+n])
  14. {
  15. c[cur]=i;
  16. vis[][i]=vis[][cur+i]=vis[][cur-i+n]=;
  17. search(cur+);
  18. vis[][i]=vis[][cur+i]=vis[][cur-i+n]=;
  19. }
  20. }
  21. }
  22.  
  23. int main()
  24. {
  25. int b[];
  26. for(n=; n<=; n++)
  27. {
  28. memset(vis,,sizeof(vis));
  29. tot=;
  30. search();
  31. b[n]=tot;
  32. }
  33. int bn;
  34. while(scanf("%d",&bn)&&bn)
  35. {
  36. printf("%d\n",b[bn]);
  37. }
  38. return ;
  39. }
 
 
 
AC代码:
  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. const int maxn=;
  5. int b[maxn],a[maxn],sum,n;
  6.  
  7. void dfs(int cur)
  8. {
  9. if(cur == n+)//递归边界,就有一种摆法
  10. sum++;
  11. else
  12. for(int j = ; j <=n; j++)
  13. {
  14. int ok=;
  15. a[cur] = j;//尝试把第cur行的皇后放在第j列
  16. for(int i = ; i<cur; i++) //检查是否和前面的皇后冲突
  17. if(a[i] == a[cur] || abs(i - cur) == abs(a[i] - a[cur]))
  18. {
  19. ok=;
  20. break;
  21. }
  22. if(ok)
  23. dfs(cur+);//如果合法,继续递归
  24. }
  25. }
  26.  
  27. int main()
  28. {
  29. for(int i = ; i <=maxn; i++)
  30. {
  31. sum = ;
  32. n= i;
  33. dfs();
  34. b[i] = sum;
  35. }
  36. while(cin>>n && n)
  37. cout<<b[n]<<endl;
  38. return ;
  39. }
 
 
一不小心找到了一个超简单,投机取巧的方法。。。。因为n<=10。但是不能ac。
  1. #include <cstdio>
  2. main()
  3. {
  4. int n,a[]={,,,,,,,,,,,,};
  5. while(scanf("%d",&n))
  6. printf("%d\n",a[n]);
  7. }
 
 
 

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皇后问题(回溯 + 剪枝)

    本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...

  3. 八皇后问题-回溯法(MATLAB)

    原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...

  4. 算法入门经典-第七章 例题7-4-1 拓展 n皇后问题 回溯法

    实际上回溯法有暴力破解的意思在里面,解决一个问题,一路走到底,路无法通,返回寻找另   一条路. 回溯法可以解决很多的问题,如:N皇后问题和迷宫问题. 一.概念 回溯算法实际类似枚举的搜索尝试过程,主 ...

  5. HDU 1016 Prime Ring Problem (回溯法)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

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

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

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

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

  8. hdu 2553 N皇后问题

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

  9. N皇后问题--回溯法

    1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每 ...

随机推荐

  1. bzoj 2245 [SDOI2011]工作安排(最小费用最大流)

    2245: [SDOI2011]工作安排 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1197  Solved: 580[Submit][Statu ...

  2. ACM编程网站

    ACM:ACM国际大学生程序设计竞赛(英文全称:ACM International Collegiate ProgrammingContest(ACM-ICPC或ICPC)是由美国计算机协会(ACM) ...

  3. linux 编译安装apache

    1.下载apache.安装apache #wget http://apache.etoak.com//httpd/httpd-2.4.4.tar.gz #tar zxvf httpd-2.4..4.t ...

  4. sql server2008 搭建链接服务器成功后查询时报Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI10" for linked server "XXXXX". 的解决方法

    这是由于链接的数据库服务器的版本与本地数据库服务器不一致,有人说要升到sp3,sp4,然后在执行什么语句之类的 我觉得太繁琐了,通过网上查询之后看到可以这么做: USE master GRANT EX ...

  5. Windows下svn客户端和服务器的安装使用

    svn,全称subversion, 是目前用的较多的开源的版本管理工具.相信有些经历的程序员应该都听说过它. 通常的svn服务器是搭建在Linux中,不过如果作为个人或者单个小组使用的话,就可以把sv ...

  6. Android WebView Error – Uncaught TypeError: Cannot call method ‘getItem’ of null at

    本质原因是js 没有判断dom 是否加载完毕 其实就是在dom 加载完毕之后处理事件 wv.getSettings().setDomStorageEnabled(true); 转自 蛙齋  http: ...

  7. [Angular 2] Custom Validtors

    Create a custom validtor which only accepts the string start with '123'; function skuValidator(contr ...

  8. 在 Java 中高效使用锁的技巧--转载

    竞争锁是造成多线程应用程序性能瓶颈的主要原因 区分竞争锁和非竞争锁对性能的影响非常重要.如果一个锁自始至终只被一个线程使用,那么 JVM 有能力优化它带来的绝大部分损耗.如果一个锁被多个线程使用过,但 ...

  9. POJ 1113 Wall 求凸包的两种方法

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31199   Accepted: 10521 Descriptio ...

  10. ASP.NET-FineUI开发实践-17

    我又不用FineUI开发,所以FineUI项目经验等于0,最近在忙别的,所以也没工夫研究.积累了论坛和群里的问题,写下来留个备份 1.在grid可编辑单元格中,如果需要在点击该单元格时,单元格中所有文 ...