【滨小之旅搜索】八皇后

news2024/9/23 19:25:08

题目传送门

[USACO1.5] 八皇后 Checker Challenge

题目描述

一个如下的 6 × 6 6 \times 6 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

上面的布局可以用序列 2   4   6   1   3   5 2\ 4\ 6\ 1\ 3\ 5 2 4 6 1 3 5 来描述,第 i i i 个数字表示在第 i i i 行的相应位置有一个棋子,如下:

行号 1   2   3   4   5   6 1\ 2\ 3\ 4\ 5\ 6 1 2 3 4 5 6

列号 2   4   6   1   3   5 2\ 4\ 6\ 1\ 3\ 5 2 4 6 1 3 5

这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
并把它们以上面的序列方法输出,解按字典顺序排列。
请输出前 3 3 3 个解。最后一行是解的总个数。

输入格式

一行一个正整数 n n n,表示棋盘是 n × n n \times n n×n 大小的。

输出格式

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

样例 #1

样例输入 #1

6

样例输出 #1

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 6 ≤ n ≤ 13 6 \le n \le 13 6n13

题目翻译来自NOCOW。

USACO Training Section 1.5


思考:

注意到题目给我们的输出方式,是以行为顺序输出相应棋子的列号的。
所以我们不难想到这道题需要以行号为搜索状态进行搜索。
每一行只能放一个棋子,所以我们在每一行中只要直接枚举当前行棋子的列号就可以了。
如何判断当前棋子是否能放呢?
注意棋子能放的条件:每行每列每条对角线只能有一颗棋子。
行号是我们搜索的状态,所以不用管,直接保证了每行只能有一颗棋子
我们只需要用三个数组分别表示当前列,两条对角线棋子的放置情况就可以了。
列好表示,直接用 L [ i ] L[i] L[i]表示第i列是否有棋子就可以了。
那么对角线呢?
在这里我们就需要用到对角线的性质:

  • 对于同一条左对角线上的点我们不难发现行和列的坐标和是一样的。
  • 而右对角线响应的是行和列的坐标差是一样的。

利用这个性质我们分别用 Z [ i ] Z[i] Z[i] Y [ i ] Y[i] Y[i]去存储行列的和差情况即可。


#include<bits/stdc++.h>
using namespace std;

int Ans = 0;
int a[20];
int n;
int L[50],Z[50],Y[50];

void Work(){
	Ans++;
	if (Ans <= 3){
	    for (int i = 1; i < n; i++) printf("%d ",a[i]);
	    printf("%d\n",a[n]);
	}
}

void Dfs(int now){
	if (now == n+1) {Work();return;}
	for (int i = 1; i <= n; i++)
	  if (!L[i] && !Z[now-i+n] && !Y[now+i]){
	  	L[i] = 1; Z[now-i+n] = 1; Y[now+i] = 1;
	  	a[now] = i;
	  	Dfs(now+1);
	  	L[i] = 0; Z[now-i+n] = 0; Y[now+i] = 0;
	  }
}

int main(){
	scanf("%d",&n);
	Dfs(1);
	printf("%d",Ans);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/735376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js中判断一个对象是否存在

一、Boolean()方法 用Boolean()方法可以将Js中的任意数据类型转为布尔值&#xff1a; 二、用于判断xx是否存在 js一般会自动执行Boolean()方法&#xff0c;我们可以借此判断某个对象在js当前的执行环境中知否存在。如&#xff1a; var x 1; // x的数据类型为数值 if (x) { …

Microsoft 宣布今年底关闭开源软件托管平台 CodePlex

Microsoft 宣布&#xff0c;将关闭开源软件托管平台 CodePlex。Microsoft 2006 年推出这项服务&#xff0c;并决定在今年 12 月 15 日将其关闭。 Microsoft 公司副总裁 Brian Harry 在网上博客中写道&#xff0c;人们将可以下载他们的数据档案&#xff0c;Microsoft 正与面向开…

Vue3 动态路由、动态组件使用示例

前期回顾 Vue3 TS Vite —— 大屏可视化 项目实战_vue3可视化大屏_彩色之外的博客-CSDN博客大屏可视化项目实战_vue3可视化大屏https://blog.csdn.net/m0_57904695/article/details/131014666?spm1001.2014.3001.5501 目录 &#x1f44d; 动态组件 &#x1f440; 动态路由…

链接做网络互动酷投票平台网络投票

关于微信投票&#xff0c;我们现在用的最多的就是小程序投票&#xff0c;今天的网络投票&#xff0c;在这里会教大家如何用“活动星投票”小程序来进行投票。 我们现在要以“读好书助成长”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星投…

3.9.错误处理的理解以及错误的传播特性

目录 前言1. thrust2. error总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简 CUDA 教程-错误处理的理解以及错误的传播…

机械臂与RealSense相机手眼标定

环境&#xff1a; 本文主要使用kinova mico机械臂 RealSense D435i深度相机进行了eye to hand的手眼标定。 系统环境&#xff1a;Ubuntu18.04&#xff0c;ROS Melodic 硬件&#xff1a;Kinova mico&#xff0c;RealSense D435i 特别注意&#xff1a;经测试&#xff0c;本方法…

大人,时代变了!做测试也要懂Python开发!(文末送书五本)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

一道有趣的C语言指针笔试题

一道有趣的指针笔试题 注&#xff1a;博主认为&#xff0c;如果想要做对并理解这一题的有关知识点&#xff0c;读者有必要对指针有一个较为全面且深刻的认识&#xff0c;如果小伙伴们对指针还不是太熟悉&#xff0c;建议先看看一篇带你玩转C语言指针&#xff1a;从入门到精通 …

OpenCV 入门教程:自适应阈值处理

OpenCV 入门教程&#xff1a;自适应阈值处理 导语一、自适应阈值处理二、示例应用2.1 图像二值化2.2 图像去噪 总结 导语 自适应阈值处理是图像处理中常用的技术之一&#xff0c;它能够根据图像的局部特征自动调整阈值&#xff0c;从而提高图像的处理效果。在 OpenCV 中&#…

手把手教你云相册项目简易开发 day1 Kafka+IDEA+Springboot+Redis+MySQL+libvips 简单运行和使用

项目的创建 项目采用的是微服务的架构。先创建一个父项目cloud-photo&#xff0c;然后再在module下创建api、image、users的子项目 相关配置&#xff1a; application.yml。此处如果没有redis的话可以先注释掉&#xff0c;因为后面启动需要mysql连接成功和redis服务启动 spr…

多元分类预测 | Matlab 麻雀算法(SSA)优化xgboost的分类预测,多特征输入模型,SSA-xgboost分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 麻雀算法(SSA)优化xgboost的分类预测,多特征输入模型,SSA-xgboost分类预测模型 多特征输入单输出的二分类及多分类模型。程序

文心一言 VS 讯飞星火 VS chatgpt (56)-- 算法导论6.3 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;56&#xff09;-- 算法导论6.3 2题 对于 BUILD-MAX-HEAP 中第 2行的循环控制变量 i 来说&#xff0c;为什么我们要求它是从A.length/2到1递减&#xff0c;而不是从1到A.length/2递增呢? 文心一言&#xff1a; 在 BUILD-MAX-HE…

MySQL每日一练:单表查询

一、首先需要创建一个名为worker的表&#xff1a; mysql> create table worker(-> part_id int(11) not null comment 部门号,-> work_id int(11) not null comment 职工号,-> work_time date not null comment 工作时间,-> salary float(8,2) not null commen…

提升工作效率:推荐几款实用的Mac项目管理工具!

在当今软件和技术高度发达的时代&#xff0c;项目管理依然是一项非常重要的任务。现在&#xff0c;有越来越多的人喜欢使用mac电脑进行项目管理&#xff0c;因为mac众所周知的稳定性和使用便捷性。但问题是&#xff0c;mac系统自带的项目管理工具并不是非常完美&#xff0c;因此…

自定义对象作为HashMap的键,同时重写hashCode和equals方法

如果要将自定义类的实例 作为HashMap的 键&#xff0c;必须重写hashCode和equals方法 简单版本&#xff0c;看不懂看后面复杂版本解释 复杂版本解释 当我们用 HashMap存入自定义的类时&#xff0c;如果不重写这个自定义类的equals和hashCode方法&#xff0c;得到的结果会和我们…

《现代操作系统(中文第四版)》第二章 进程与线程

第二章、进程与线程 操作系统最核心的概念就是进程&#xff0c;这是对正在运行程序的一个抽象。进程是操作系统提供的最古老的也是最重要的抽象概念之一&#xff0c;即使可以使用的cpu只有一个&#xff0c;他们也具有支持并发操作的能力&#xff0c;它们将一个单独的cpu变换成…

【azcopy】

azcopy 下载使用输出 下载 https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10#download-azcopy使用 cd /Users/YJY/Downloads/azcopy_darwin_amd64_10.19.0./azcopy copy https://tapvqacaption.blob.core.windows.net/data/save /Users/YJY/D…

多元分类预测 | Matlab 灰狼算法(GWO)优化xgboost的分类预测模型,多特征输入模型,GWO-xgboost分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 灰狼算法(GWO)优化xgboost的分类预测模型,多特征输入模型,GWO-xgboost分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

【分布式应用】zabbix:代理服务器、及监控其它应用

目录 一、部署 zabbix 代理服务器1.环境配置1.2设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy1.3部署数据库1.4在 Web 页面配置 agent 代理1.5 配置 agent 使用 proxy 二、Zabbix 监控 Windows 系统三、zabbix监控java应用3.1、客户端开启 java jmxremote 远程监控功能3.…

C语言程序设计——数据在内存中的存储

一、数据类型介绍 1.基本内置类型 char // 字符数据类型 1 B short // 短整型 2 B int // 整型 4 B long // 长整型 4 or 8 B long long //更长的整型 8 B float //单精度浮点型 4 B double //双精…