去重N皇后
题目:将上下对称、左右对称棋局、主副对角线对称棋局和旋转后重复视为重复,则要求输出去重后的N皇后问题的棋盘布局
这道题是一道作业题,我都惊到了,一向弱智的作业题中竟然冒出一道这样的题,这题最起码橙黄之间的难度,标个黄应该也没什么问题。我竟然写了一百多行代码,在不影响可读性的情况下去掉无用行后仍有98行(如果舍弃结构化编程思想全部写入主函数内的话还能再减少几十行,但那是很不好的编程习惯,所以没那么做)。可见这道作业题还是蛮麻烦的,总体来说就是一个模拟方阵各类操作+常规N皇后求解的问题
Code
#include <iostream>
#include <vector>
using namespace std;
int N,ans;
vector<int> S,A[20];
int ud(const vector<int>& A,const vector<int>& B)
{
for(int i=1;i<=N;i++)
if(A[i]!=B[N+1-i])//i,j->n+1-i,j
return 0;
return 1;
}
int lr(const vector<int>& A,const vector<int>& B)
{
for(int i=1;i<=N;i++)
if(A[i]+B[i]!=N+1)//i,j->i,n+1-j
return 0;
return 1;
}
int lk(const vector<int>& A,const vector<int>& B)
{
for(int i=1;i<=N;i++)
if(i+B[N+1-A[i]]!=N+1) //i,j->n+1-j,n+1-i
return 0;
return 1;
}
int rk(const vector<int>& A,const vector<int>& B)
{
for(int i=1;i<=N;i++) //i,j->j,o
if(B[A[i]]!=i)
return 0;
return 1;
}
const vector<int> spin(const vector<int> A)
{
vector<int>B;//i,j->j,n+1-i
for(int i=0;i<=N;i++)
B.push_back(0);
for(int i=1;i<=N;i++)
B[A[i]]=N+1-i;
return B;
}
int r1(const vector<int>& A,const vector<int>& B)
{
if(spin(A)==B)return 1;
return 0;
}
int r2(const vector<int>& A,const vector<int>& B)
{
if(spin(spin(A))==B)return 1;
return 0;
}
int r3(const vector<int>& A,const vector<int>& B)
{
if(spin(spin(spin(A)))==B)return 1;
return 0;
}
void f(int n)
{
if(n==N+1)
{
for(int i=1;i<=ans;i++)
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))
return;
A[++ans]=S;
}
for(int i=1;i<=N;i++)
{
int flag=1;
for(int k=1;k<n;k++)
if(S[k]==i||S[k]-k==i-n||S[k]+k==i+n)
{
flag=0;
break;
}
if(flag==1)
{
S.push_back(i);
f(n+1);
S.pop_back();
}
}
}
signed main()
{
cin>>N;
S.push_back(0);
f(1);
for(int i=1;i<=ans;i++)
{
cout<<"No"<<i<<':';
for(int j=1;j<=N;j++)
cout<<A[i][j]<<' ';
cout<<endl;
}
return 0;
}
去重N皇后的更多相关文章
- PAT (Advanced Level) 1128~1131:1128N皇后 1129 模拟推荐系统(set<Node>优化) 1130 中缀表达式
1128 N Queens Puzzle(20 分) 题意:N皇后问题.按列依次给定N个皇后的行号,问N个皇后是否能同时不存在行冲突.列冲突和主副对角线冲突. 分析: 1.根据题意一定不存在列冲突,所 ...
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- 数组去重 JS
我说的数组去重是这样的: var arr = ['f', 'a', 'b', 'd', 'e', 'g'] ; var str='f'; 去除arr中的str 最简单的是遍历arr与str做比较, ...
- [Algorithm] 使用SimHash进行海量文本去重
在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...
- JS去重及字符串奇数位小写转大写
面试中经常会考到数组的去重.作为一名合格的前端开发者,不知道几种去重方法是在不应该.废话不多说直接开撸-- 一.indexOf()方法 实现思路:使用indexOf()方法来判断新数组中是否有这个值, ...
- js数组去重
这就是数组去重了...var str=['hello','node','element','node','hello','blue','red'];var str1=[]; function firs ...
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- [Hadoop]-从数据去重认识MapReduce
这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...
- 1.uniq去重命令讲解
uniq命令: 常见参数: -c,--count ***** 在每行旁边显示改行重复出现的次数 -d,--repeated 仅显示重复出现的行,2次或2次以上的行,默认的去重包 ...
随机推荐
- 必知必会Java
你好,我是阿光. 最近想着把工作中使用过的java命令都梳理一下,方便日后查阅.虽然这类文章很多,但自己梳理总结后,还是会有一些新的收获.这也是这篇笔记的由来. 今天先聊聊 jps 命令. 命令概述 ...
- bash shell笔记整理——less命令
less命令的作用 less和cat.more最大的差别在于不会一次性加载整个文件,速度比较快!另外less具备翻页功能,可以向上/向下翻页! 语法 less [选项] [文件名] *选项* *使用说 ...
- 腾讯云服务器安装MySQL5.7基于xshell
腾讯云服务器安装MySQL5.7基于xshell 下载MySQL57安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-1 ...
- MOSS对话式大型语言模型
MOSS是复旦大学自然语言处理实验室发布的一种类似于ChatGPT的会话语言模型.MOSS能够按照用户的指示执行各种自然语言任务,包括回答问题.生成文本.摘要文本.生成代码等.MOSS还能够挑战错误的 ...
- 从零玩转设计模式之建造者模式-jianzaozhemoshi
title: 从零玩转设计模式之建造者模式 date: 2022-12-08 18:15:30.898 updated: 2022-12-23 15:35:58.428 url: https://ww ...
- Python 猫的 2023 年终回顾
2023 年是 Python猫 创办的第 5 年,2024 年已经到来了,我们照例做一个简短的年终回顾吧. 1.30000 订阅与 200 原创. 2020 的年终总结时,公众号订阅数刚破 20000 ...
- 某RBAC管理系统审计
某RBAC管理系统审计 前言 这个管理系统的审计我去年就开始了但烂尾了,那时候太热闹了log4j2,cs的cve反制等等.这个都给忘了,所以本篇可能有些图有点老,现在就是旧图没一个个换遇到的新的就加上 ...
- 部署堡垒机4——CentOS7 编译安装 Python 3.8.12
1.去python3的官方网站下载源代码 https://www.python.org/downloads/ 下载安装Python 3.8.12到/opt/python3 cd /opt wget h ...
- uni-app+vue3+ts项目搭建完整流程
项目代码同步更新至码云 uni-vue3-ts-template 开发前准备 利用 uni-app 开发,有两种方法: 通过 HBuilderX 创建(需安装 HBuilderX 编辑器) 通过命令行 ...
- Protobuf 的基本使用
Protobuf 是 Google 用于序列化数据对象的一种机制,使得数据对象能够在应用程序和服务器之间进行交互,尽管现在 Java 已经对应的序列化的实现方式,但是传统的序列化方式存在严重的缺陷,因 ...