题目链接:http://poj.org/problem?id=3239

构造法很牛逼啊,把这个搜索的题直接变成了打表。

我用dfs写了一下。

构造法公式(序列):
一、当n mod 6 != 2 或 n mod 6 != 3时:

[2,4,6,8,...,n],[1,3,5,7,...,n-1]        (n为偶数)

[2,4,6,8,...,n-1],[1,3,5,7,...,n ]       (n为奇数)
二、当n mod 6 == 2 或 n mod 6 == 3时

(当n为偶数,k=n/2;当n为奇数,k=(n-1)/2)

[k,k+2,k+4,...,n],[2,4,...,k-2],[k+3,k+5,...,n-1],[1,3,5,...,k+1]         (k为偶数,n为偶数)
[k,k+2,k+4,...,n-1],[2,4,...,k-2],[k+3,k+5,...,n-2],[1,3,5,...,k+1],[n]     (k为偶数,n为奇数)
[k,k+2,k+4,...,n-1],[1,3,5,...,k-2],[k+3,...,n],[2,4,...,k+1]              (k为奇数,n为偶数)
[k,k+2,k+4,...,n-2],[1,3,5,...,k-2],[k+3,...,n-1],[2,4,...,k+1],[n ]      (k为奇数,n为奇数)

这个规律我是没有搞懂的,反正很牛就是了。

我也用dfs写了一下,虽然我知道肯定会T,DFS30层就爆栈了,更何况这里是300层,就当是熟悉一下DFS了。

两种方法贴上。

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int n;
  5. int ans = ;
  6. int maps[][] = {};
  7.  
  8. bool judge(int k,int i)
  9. {
  10. for(int j=; j<=n&&j!=i; j++)
  11. if(maps[k][j]==)
  12. return false;
  13.  
  14. for(int j=; j<=n&&j!=k; j++)
  15. if(maps[j][i]==)
  16. return false;
  17.  
  18. for(int j=; k+j<=n&&i+j<=n; j++)
  19. {
  20. if(maps[k+j][i+j]==)
  21. return false;
  22. }
  23.  
  24. for(int j=; k-j>=&&i-j>=; j++)
  25. {
  26. if(maps[k-j][i-j]==)
  27. return false;
  28. }
  29.  
  30. for(int j=; k-j>=&&i+j<=n; j++)
  31. {
  32. if(maps[k-j][i+j]==)
  33. return false;
  34. }
  35.  
  36. for(int j=; k+j<=n&&i-j>=; j++)
  37. {
  38. if(maps[k+j][i-j]==)
  39. return false;
  40. }
  41.  
  42. return true;
  43. }
  44.  
  45. bool dfs(int k)
  46. {
  47. if(k>n)
  48. {
  49. ans ++;
  50. for(int i=; i<=n; i++)
  51. {
  52. for(int j=; j<=n; j++)
  53. {
  54. if(maps[i][j])
  55. printf("%d",j);
  56. }
  57. }
  58. printf("\n");
  59. return true;
  60. }
  61.  
  62. for(int i=; i<=n; i++)
  63. {
  64. if(judge(k,i))
  65. {
  66. maps[k][i] = ;
  67. if(dfs(k+))
  68. return true;
  69. maps[k][i] = ;
  70. }
  71. }
  72. return false;
  73. }
  74.  
  75. int main()
  76. {
  77. while(scanf("%d",&n),n)
  78. {
  79. memset(maps,,sizeof(maps));
  80. for(int i=; i<=n; i++)
  81. {
  82. maps[][i] = ;
  83. if(dfs())
  84. break;
  85. maps[][i] = ;
  86. }
  87. //printf("%d\n",ans);
  88. }
  89. return ;
  90. }
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int n;
  6. while(scanf("%d",&n),n)
  7. {
  8. if(n%!=&&n%!=)
  9. {
  10. if(n%==)
  11. {
  12. for(int i=;i<=n;i+=)
  13. printf("%d ",i);
  14. for(int i=;i<=n-;i+=)
  15. printf("%d ",i);
  16. printf("%d\n",n-);
  17. }
  18. else {
  19. for(int i=;i<=n-;i+=)
  20. printf("%d ",i);
  21. for(int i=;i<=n-;i+=)
  22. printf("%d ",i);
  23. printf("%d\n",n);
  24. }
  25. }
  26. else
  27. {
  28. if(n%==)
  29. {
  30. int k=n/;
  31. if(k%==)
  32. {
  33. for(int i=k;i<=n;i+=)
  34. printf("%d ",i);
  35. for(int i=;i<=k-;i+=)
  36. printf("%d ",i);
  37. for(int i=k+;i<=n-;i+=)
  38. printf("%d ",i);
  39. for(int i=;i<=k-;i+=)
  40. printf("%d ",i);
  41. printf("%d\n",k+);
  42. }
  43. else
  44. {
  45. for(int i=k;i<=n-;i+=)
  46. printf("%d ",i);
  47. for(int i=;i<=k-;i+=)
  48. printf("%d ",i);
  49. for(int i=k+;i<=n;i+=)
  50. printf("%d ",i);
  51. for(int i=;i<=k-;i+=)
  52. printf("%d ",i);
  53. printf("%d\n",k+);
  54. }
  55. }
  56. else
  57. {
  58. int k=(n-)/;
  59. if(k%==)
  60. {
  61. for(int i=k;i<=n-;i+=)
  62. printf("%d ",i);
  63. for(int i=;i<=k-;i+=)
  64. printf("%d ",i);
  65. for(int i=k+;i<=n-;i+=)
  66. printf("%d ",i);
  67. for(int i=;i<=k+;i+=)
  68. printf("%d ",i);
  69. printf("%d\n",n);
  70. }
  71. else
  72. {
  73. for(int i=k;i<=n-;i+=)
  74. printf("%d ",i);
  75. for(int i=;i<=k-;i+=)
  76. printf("%d ",i);
  77. for(int i=k+;i<=n-;i+=)
  78. printf("%d ",i);
  79. for(int i=;i<=k+;i+=)
  80. printf("%d ",i);
  81. printf("%d\n",n);
  82. }
  83. }
  84. }
  85.  
  86. }
  87. return ;
  88. }

Poj (3239),m皇后问题的更多相关文章

  1. Poj 3239 Solution to the n Queens Puzzle

    1.Link: http://poj.org/problem?id=3239 2.Content: Solution to the n Queens Puzzle Time Limit: 1000MS ...

  2. POJ 1321 棋盘问题【DFS/回溯/放与不放/类似n皇后】

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62164 Accepted: 29754 Description 在一 ...

  3. [poj百练]2754:八皇后 回溯

    描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后 ...

  4. POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47960   Accepted: 23210 Descriptio ...

  5. Poj 1321 棋盘问题 【回溯、类N皇后】

    id=1321" target="_blank">棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  6. bzoj 3239 poj 2417 BSGS

    BSGS算法,预处理出ϕ(c)−−−−√内的a的幂,每次再一块一块的往上找,转移时将b乘上逆元,哈希表里O(1)查询即可 #include<cstdio> #include<cstr ...

  7. POJ 矩阵相乘 (随机化算法-舍伍德(Sherwood))

    周三的算法课,主要讲了随机化算法,介绍了拉斯维加斯算法,简单的理解了为什么要用随机化算法,随机化算法有什么好处. 在处理8皇后问题的时候,穷举法是最费时的,回朔比穷举好点,而当数据量比较大的时候,如1 ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. OpenJudge/Poj 1321 棋盘问题

    1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...

随机推荐

  1. sf01_什么是数据结构

    数据结构解决什么问题 如何在计算机中存储数据和信息,采用什么样的方法和技巧加工处理这些数据,都是数据结构需要努力解决的问题. 解决问题的步骤 使用计算机解决问题的步骤:分析具体问题得到数学模型,设计解 ...

  2. Python Numpy Array

    Numpy 是Python中数据科学中的核心组件,它给我们提供了多维度高性能数组对象. Arrays Numpy.array   dtype 变量 dtype变量,用来存放数据类型, 创建数组时可以同 ...

  3. RTT之内存管理及异常中断

    内存管理分静态内存管理和动态内存管理(根据大小又分2种) 静态内存管理:创建.删除.初始化.解绑.申请和释放.初始化内存池是属于静态内存管理,与创建内存池不同的是,此处内存池对象所使用的内存空间是由用 ...

  4. maya2012安装失败如何卸载重装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  5. Deferred跟promise跟js同步问题记录

    之前的时候,碰到过几次同事问我,说js的同步怎么处理,就是我想先执行这段代码(耗时相对较长的一行,多数是异步的一些api调用),执行完了之后我再执行下边这句,每次我都很无奈的说不晓得,如果是ajax的 ...

  6. JavaScript DOM基础总结

    上个月在进行百度三面时候,面试官提问JavaScript DOM方法,我回答的有点少,前面太关注JavaScript 兼容性,框架方面,JavaScript 原生DOM基础没有记牢,心中有点遗憾.下来 ...

  7. redis 读写锁实现

    一 先搞清楚读写锁要做什么. 基本就是 读读不互斥,读写互斥,写写互斥.可重入. 关于redis读写锁,我写了一次之后,总觉得很怪,然后就上网看到大神的redisson了,果断借鉴一番. 二 读行为 ...

  8. avalon教程-简介

    avalon是什么? avalon是一个MVVM框架, Modle-模型层,即为js中从后台接口中取出的数据,例如一个对象或者对象数组,并对这些数据进行一定的格式化.常见的返回数据是这样的{id : ...

  9. 多ComboBox实现复杂查询

    关键是,你是要实现什么功能:是四个条件都有内容时查询,还是哪个内容有查哪个? 如果四个组合框都有内容,相对简单些: string s = "select * from 表名 where 身份 ...

  10. C# WinForm拖入文件到窗体,得到文件路径

    private void textBox1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataForma ...