题目:将上下对称、左右对称棋局、主副对角线对称棋局和旋转后重复视为重复,则要求输出去重后的N皇后问题的棋盘布局

这道题是一道作业题,我都惊到了,一向弱智的作业题中竟然冒出一道这样的题,这题最起码橙黄之间的难度,标个黄应该也没什么问题。我竟然写了一百多行代码,在不影响可读性的情况下去掉无用行后仍有98行(如果舍弃结构化编程思想全部写入主函数内的话还能再减少几十行,但那是很不好的编程习惯,所以没那么做)。可见这道作业题还是蛮麻烦的,总体来说就是一个模拟方阵各类操作+常规N皇后求解的问题

Code

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int N,ans;
  5. vector<int> S,A[20];
  6. int ud(const vector<int>& A,const vector<int>& B)
  7. {
  8. for(int i=1;i<=N;i++)
  9. if(A[i]!=B[N+1-i])//i,j->n+1-i,j
  10. return 0;
  11. return 1;
  12. }
  13. int lr(const vector<int>& A,const vector<int>& B)
  14. {
  15. for(int i=1;i<=N;i++)
  16. if(A[i]+B[i]!=N+1)//i,j->i,n+1-j
  17. return 0;
  18. return 1;
  19. }
  20. int lk(const vector<int>& A,const vector<int>& B)
  21. {
  22. for(int i=1;i<=N;i++)
  23. if(i+B[N+1-A[i]]!=N+1) //i,j->n+1-j,n+1-i
  24. return 0;
  25. return 1;
  26. }
  27. int rk(const vector<int>& A,const vector<int>& B)
  28. {
  29. for(int i=1;i<=N;i++) //i,j->j,o
  30. if(B[A[i]]!=i)
  31. return 0;
  32. return 1;
  33. }
  34. const vector<int> spin(const vector<int> A)
  35. {
  36. vector<int>B;//i,j->j,n+1-i
  37. for(int i=0;i<=N;i++)
  38. B.push_back(0);
  39. for(int i=1;i<=N;i++)
  40. B[A[i]]=N+1-i;
  41. return B;
  42. }
  43. int r1(const vector<int>& A,const vector<int>& B)
  44. {
  45. if(spin(A)==B)return 1;
  46. return 0;
  47. }
  48. int r2(const vector<int>& A,const vector<int>& B)
  49. {
  50. if(spin(spin(A))==B)return 1;
  51. return 0;
  52. }
  53. int r3(const vector<int>& A,const vector<int>& B)
  54. {
  55. if(spin(spin(spin(A)))==B)return 1;
  56. return 0;
  57. }
  58. void f(int n)
  59. {
  60. if(n==N+1)
  61. {
  62. for(int i=1;i<=ans;i++)
  63. if(ud(A[i],S)||lr(A[i],S)||lk(A[i],S)||rk(A[i],S)||r1(A[i],S)||r2(A[i],S)||r3(A[i],S))
  64. return;
  65. A[++ans]=S;
  66. }
  67. for(int i=1;i<=N;i++)
  68. {
  69. int flag=1;
  70. for(int k=1;k<n;k++)
  71. if(S[k]==i||S[k]-k==i-n||S[k]+k==i+n)
  72. {
  73. flag=0;
  74. break;
  75. }
  76. if(flag==1)
  77. {
  78. S.push_back(i);
  79. f(n+1);
  80. S.pop_back();
  81. }
  82. }
  83. }
  84. signed main()
  85. {
  86. cin>>N;
  87. S.push_back(0);
  88. f(1);
  89. for(int i=1;i<=ans;i++)
  90. {
  91. cout<<"No"<<i<<':';
  92. for(int j=1;j<=N;j++)
  93. cout<<A[i][j]<<' ';
  94. cout<<endl;
  95. }
  96. return 0;
  97. }

去重N皇后的更多相关文章

  1. PAT (Advanced Level) 1128~1131:1128N皇后 1129 模拟推荐系统(set<Node>优化) 1130 中缀表达式

    1128 N Queens Puzzle(20 分) 题意:N皇后问题.按列依次给定N个皇后的行号,问N个皇后是否能同时不存在行冲突.列冲突和主副对角线冲突. 分析: 1.根据题意一定不存在列冲突,所 ...

  2. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  3. 递归实现n(经典的8皇后问题)皇后的问题

    问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...

  4. 数组去重 JS

    我说的数组去重是这样的: var arr = ['f', 'a',  'b', 'd', 'e', 'g']  ; var str='f'; 去除arr中的str 最简单的是遍历arr与str做比较, ...

  5. [Algorithm] 使用SimHash进行海量文本去重

    在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...

  6. JS去重及字符串奇数位小写转大写

    面试中经常会考到数组的去重.作为一名合格的前端开发者,不知道几种去重方法是在不应该.废话不多说直接开撸-- 一.indexOf()方法 实现思路:使用indexOf()方法来判断新数组中是否有这个值, ...

  7. js数组去重

    这就是数组去重了...var str=['hello','node','element','node','hello','blue','red'];var str1=[]; function firs ...

  8. 八皇后算法的另一种实现(c#版本)

    八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...

  9. [Hadoop]-从数据去重认识MapReduce

    这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...

  10. 1.uniq去重命令讲解

    uniq命令: 常见参数: -c,--count *****      在每行旁边显示改行重复出现的次数 -d,--repeated        仅显示重复出现的行,2次或2次以上的行,默认的去重包 ...

随机推荐

  1. lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O

    -- create a class Animal={name = "no_name" , age=0 } function Animal:bark(voice) print(sel ...

  2. i-MES生产制造管理系统-SMT物料防错与追溯

    说起 SMT,相信大家或多或少都有一些了解,主要是用来贴片的,简单点说就是给空白的 PCB 板贴上一些元器件,比如二极管.IC.电阻等等各种电子元器件,以前客户对这些元器件物料的追溯管控的并不严格,只 ...

  3. JQuery_2

    1.动画:    1.三种方式显示和隐藏元素       1.默认方式       1.show([speed,[easing],[fn]])         1.参数:             1. ...

  4. .Net 8与硬件设备能碰撞出怎么样的火花(使用ImageSharp和Protobuf协议通过HidApi与设备通讯)

    前言 本人最近在社区里说想做稚晖君的那个瀚文键盘来着,结果遇到两个老哥一个老哥送了我电路板,一个送了我焊接好元件的电路板,既然大家这么舍得,那我也就真的投入制作了这把客制化键盘,当然我为了省钱也是特意 ...

  5. 2023-12-20:用go语言,给定一个数组arr,长度为n,在其中要选两个不相交的子数组。 两个子数组的累加和都要是T,返回所有满足情况中,两个子数组长度之和最小是多少? 如果没有有效方法,返回-

    2023-12-20:用go语言,给定一个数组arr,长度为n,在其中要选两个不相交的子数组. 两个子数组的累加和都要是T,返回所有满足情况中,两个子数组长度之和最小是多少? 如果没有有效方法,返回- ...

  6. Rabbit加密算法

    一.引言 随着信息技术的快速发展,数据安全已成为越来越受到重视的领域.加密算法作为保障数据安全的重要技术手段,在通信.存储等领域得到了广泛应用.Rabbit加密算法作为一种新型的加密算法,凭借其简单易 ...

  7. 合宙esp32 c3 micro python 固件配置(基于thonny)

    首先,本文档是已经配置过其他esp32后发现合宙的配置需要修改一些地方. 为了让新手们减少掉坑成本,故做了一个图文指导. 准备工作: 1.thonny安装(不讲,自己去查教程) 2.esp32c3 m ...

  8. python异步编程之asyncio高阶API

    asyncio 高阶API列表 asyncio中函数可以分为高阶函数和低阶函数.低阶函数用于调用事件循环.linux 套接字.信号等更底层的功能,高阶函数是屏蔽了更多底层细节的任务并发,任务执行函数. ...

  9. JavaFx FXML入门(五)

    JavaFx FXML入门(五) JavaFX 从入门入门到入土系列 JavaFx的FXML类似安卓中的视图文件,可以添加样式,添加css,添加id然后在java代码中绑定点击事件.可以使用工具编辑: ...

  10. Apache Hudi在信息服务行业构建流批一体的实践

    个人介绍 李昂 高级数据研发工程师 Apache Doris & Hudi Contributor 业务背景 部门成立早期, 为了应对业务的快速增长, 数仓架构采用了最直接的Lambda架构 ...