openjudge_2.5基本算法之搜索_200:Solitaire

news2024/11/23 3:03:28

题目

200:Solitaire
总时间限制: 5000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
描述
Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered from 1 to 8, from the top to the bottom and from left to right respectively.
There are four identical pieces on the board. In one move it is allowed to:move a piece to an empty neighboring field (up, down, left or right),jump over one neighboring piece to an empty field (up, down, left or right).
在这里插入图片描述
There are 4 moves allowed for each piece in the configuration shown above. As an example let’s consider a piece placed in the row 4, column 4. It can be moved one row up, two rows down, one column left or two columns right.
Write a program that:
reads two chessboard configurations from the standard input,verifies whether the second one is reachable from the first one in at most 8 moves,
writes the result to the standard output.
输入
Each of two input lines contains 8 integers a1, a2, …, a8 separated by single spaces and describes one configuration of pieces on the chessboard. Integers a2j-1 and a2j (1 <= j <= 4) describe the position of one piece – the row number and the column number respectively.
输出
The output should contain one word YES if a configuration described in the second input line is reachable from the configuration described in the first input line in at most 8 moves, or one word NO otherwise.
样例输入
4 4 4 5 5 4 6 5
2 4 3 3 3 6 4 6
样例输出
YES

翻译

8*8的棋盘有四个棋子,输入四个棋子的位置和输出的位置,判断在8步内能不能走到。

理解

1.棋盘中四个棋子座位为一个布局作为整体操作,用struct,有四个横坐标,四个纵坐标。
请添加图片描述

2.四个棋子四个方向独立运行,只要没走过就走,宽搜,枚举到达目标布局。
请添加图片描述

3.标记棋盘走出哪些布局,4个坐标——8维数组,每两个是一个坐标。如始发布局k[4][4][4][5][5][4][6][5]=1。
4.最终落棋位置用布尔数组goal[9][9]表示,0-8(9个数)的数组,两个维度就是一对坐标。
要判断到终点没,就是四个棋子的位置都是终点标记位置
四个棋子有四个坐标,goal[4][4]=1,goal[4][5]=1,goal[5][4]=1, goal[6][5]=1都是1就说明到达目的地。
5.判断是否出界。
6.要判断是否重叠,如果重叠得还得走一次,再判断出界和重叠
走完后,如果没有出界,不是已走过,没有重叠,
再看是否到终点没
否则就加入队列,
请添加图片描述

代码

#include <bits/stdc++.h>
using namespace std;
struct cbord{//一张棋盘四个棋子坐标,到达该布局的步数
int x[4],y[4],step;
}s,b;//出发布局,宽搜队首布局
bool k[9][9][9][9][9][9][9][9],//88(1-8)棋盘上4个棋子坐标(42=8)宽搜标记
goal[9][9];//四个目标位置的坐标。
int d[4][2]={{0,-1},{-1,0},{0,1},{1,0}};//左上右下移动
bool reached(cbord c){//判定四个棋子位置是不是目标位置
for(int i=0;i<4;i++)
if(!goal[c.x[i]][c.y[i]])return 0;//有个棋子坐标不是目标位置就错
return 1;
}
bool overlap(cbord c,int x){//两棋子是否重叠了
for(int i=0;i<4;i++)
if(i!=x&&c.x[i]==c.x[x]&&c.y[i]==c.y[x])return 1;//有两个棋子位置重了
return 0;
}
void view(cbord c){
for(int i=0;i<4;i++)
cout<<c.x[i]<<“,”<<c.y[i]<<“\t”;
cout<<“=”<<c.step<<endl;
}
bool bfs(){
queue q;q.push(s);
k[s.x[0]][s.y[0]][s.x[1]][s.y[1]][s.x[2]][s.y[2]][s.x[3]][s.y[3]]=1;//标记四个棋子坐标位置已经到过
int x,y;
while(!q.empty()){//广搜
b=q.front();q.pop();
//view(b);
if(b.step>=8)continue;//取消超过8步的走法
if(reached(b))return 1;//到达目标布局
for(int i=0;i<4;i++){//四个棋子
//s=b;//不在这里,每个方向间无顺序相互独立
for(int j=0;j<4;j++){//四个方向
s=b;//拷贝布局,再改
s.x[i]+=d[j][0],s.y[i]+=d[j][1];//改坐标
if(s.x[i]<1||s.x[i]>8||s.y[i]<1||s.y[i]>8)continue;//出界了不要
if(overlap(s,i)){//重叠了
s.x[i]+=d[j][0],s.y[i]+=d[j][1];//可以跳
if(s.x[i]<1||s.x[i]>8||s.y[i]<1||s.y[i]>8)continue;//出界了不要
if(overlap(s,i))continue;//再重叠就不能要了
}
if(k[s.x[0]][s.y[0]][s.x[1]][s.y[1]][s.x[2]][s.y[2]][s.x[3]][s.y[3]])continue;//已经走过这个布局
k[s.x[0]][s.y[0]][s.x[1]][s.y[1]][s.x[2]][s.y[2]][s.x[3]][s.y[3]]=1;//标记
s.step++;//多一步
if(reached(s))return 1;//到达目标布局
q.push(s);//放进队列再宽搜
}
}
}
return 0;
}
int main(){
//freopen(“data.cpp”,“r”,stdin);
for(int i=0;i<4;i++)cin>>s.x[i]>>s.y[i];
int x,y;
for(int i=0;i<4;i++){
cin>>x>>y;goal[x][y]=1;//该位置是其中一个坐标。共有四个棋子位置
}
if(bfs())cout<<“YES”;
else cout<<“NO”;
return 0;
}

小结

宽搜就跟枚举一样,全试。
四个棋子四个方向没有先后顺序,相互独立是关键。
for(int i=0;i<4;i++){//四个棋子
//s=b;//不在这里,每个方向间无顺序相互独立
for(int j=0;j<4;j++){//四个方向
s=b;//拷贝布局,再改
s.x[i]+=d[j][0],s.y[i]+=d[j][1];//改坐标

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

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

相关文章

maven-idea新建和导入项目

全局配置 新建项目 需要新建的文件夹 src/testsrc/test/javasrc/main/java 注&#xff1a;1、新建Java-class&#xff0c;输入.com.hello.hellomaven 2、快捷键psvm显示 public static void main(String[] args) {.... } package com.hello;public class hellomaven {publ…

Java-字符集和字符编码-roadmap

1 需求 2 接口 3 示例 4 参考资料 「烫烫屯屯锟斤拷」揭秘ASCII、GBK、UTF-8&#xff0c;B站独家&#xff0c;一听就懂_哔哩哔哩_bilibili 非常详细的字符编码讲解&#xff0c;ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有_哔哩哔哩_bilibili 你懂乱码吗&#xff1f;锟斤…

Feign负载均衡

Feign负载均衡 概念总结 工程构建Feign通过接口的方法调用Rest服务&#xff08;之前是Ribbon——RestTemplate&#xff09; 概念 官网解释: http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign Feign是一个声明式WebService客户端。使用Feign能让…

Vitis HLS 学习笔记--Syn Report解读(1)

目录 1. 介绍 2. 示例一 2.1 HLS 代码 2.2 Report 解读 2.2.1 General Information 2.2.2 Timing Estimate 2.2.3 Performance & Resource Estimates 2.2.4 HW interfaces 2.2.4.1 硬件接口报告 2.2.4.2 导出至 Vivado 中的 IP 2.2.4.3 Port-Level Protocols 端…

【小梦C嘎嘎——启航篇】C++四大类型转换

&#x1f60e; 前言&#x1f64c;C四大类型转换什么是类型转换C语言中的类型转换为什么C要嫌弃C语言的类型转换&#xff1f;自行搞一套呢&#xff1f;C强制类型转换1、static_cast2、reinterpret_cast3、const_cast4、dynamic_cast为什么要支持向下转呢&#xff1f; RTTI 总结撒…

C++之STL-list+模拟实现

目录 一、list的介绍和基本使用的方法 1.1 list的介绍 1.2 list的基本使用方法 1.2.1 构造方法 1.2.2 迭代器 1.2.3 容量相关的接口 1.2.4 增删查改的相关接口 1.3 关于list迭代器失效的问题 二、模拟实现list 2.1 节点类 2.2 迭代器类 2.3 主类list类 2.3.1 成员变…

yolov8 dll 编译

1. 每次用yolo v8 都要用python &#xff0c;对于我这种写软件的太不方便了&#xff0c;下面尝试编译dll 调用, 我已经有做好的模型.best.pt 参考视频方法: yolov8 TensorRT C 部署_哔哩哔哩_bilibili 【yolov8】tensorrt部署保姆级教程&#xff0c;c版_哔哩哔哩_bilibili 需…

C语言基础知识笔记——万字学习记录

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要参考浙大翁恺老师的C语言讲解以及其他博主的C语言学习笔记&#xff0c;进而梳理C语言的基础知识&#xff0c;为后续系统性学习数据结构和其他语言等知识夯实一定的基础。&#xff08;其他博主学习笔记的链接包括&#x…

陕西省人力资源和社会保障厅 陕西省住房和城乡建设厅 关于开展2023年度全省建设工程专业高级工程师评审工作的通知

陕西工程系列建设工程专业工程师评审工作要求链接陕西省人力资源和社会保障厅 陕西省住房和城乡建设厅 关于开展2023年度全省建设工程专业高级工程师评审工作的通知 - 陕西省住房和城乡建设厅类别基本条件业绩成果备注助理工程师 最新公告http://www.snhrm.com/zxggao2/597358…

怎么排查K8S容器当中的Java程序内存泄露问题

今天早上发现生产线其中的一个服务在凌晨的时候突然重启了&#xff0c;内存突然从1G升到1.8G&#xff0c;CPU使用量从0.1升到了0.28&#xff0c;说明在这个时间点&#xff0c;内存突增达到了限额以上&#xff0c;服务重启了。因为这个服务布署了多节点&#xff0c;这次重启对业…

不同技术实现鼠标滚动图片的放大缩小

摘要&#xff1a; 最近弄PC端的需求时&#xff0c;要求在layui技术下实现鼠标滚动图片的放大缩小的功能&#xff01;下面来总结一下不同框架剩下这功能&#xff01; layui: 看了一下layui文档&#xff0c;其实这有自带的组件的&#xff01;但是又版本要求的!并且layui的官方文档…

element 分页切换时:current-page无效 页数不会跟着一起切换

问题回溯&#xff1a;使用el-pagination组件 选择切换当前分页 页数为2 问题结果&#xff1a;el-pagination组件 当前页切换失败 一直都是 1&#xff0c;接口传参分页数据是2&#xff0c;打印当前分页也是2 解决方案1&#xff1a;使用 current-page参数 .sync 修饰符 解决方案2…

北京车展创新纷呈,移远通信网联赋能

时隔四年&#xff0c;备受瞩目的2024&#xff08;第十八届&#xff09;北京国际汽车展览会于4月25日盛大开幕。在这场汽车行业盛会上&#xff0c;各大主流车企竞相炫技&#xff0c;众多全球首发车、概念车、新能源车在这里汇聚&#xff0c;深刻揭示了汽车产业的最新成果和发展潮…

某赛通电子文档安全管理系统 多处 SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

函数模板与类模板初阶

如果要写一个交换函数&#xff0c;不同类型的话调用不同的交换函数&#xff0c;如果使用重载的话只能解决函数名相同但是会根据参数类型调用不同的函数。即使这样也依旧要写很多不同类型的swap交换函数 函数重载的交换函数 仔细观察会发现除了类型不同其他的函数结构什么的都一…

Postman 在 Linux 上的安装指南:简单快速开始使用

本文将介绍如何在 Linux 上安装 Postman 的详细步骤&#xff0c;Postman 支持的 Linux 的发行版包括&#xff1a;Ubuntu 14.04 及更高版本&#xff0c;Fedora 24&#xff0c;Debian 8 及更高版本。下面将介绍其具体的安装方法。 手动安装 Postman 的下载地址&#xff0c;下载…

一、Django 初识

简介 Django 是一个用于构建 Web 应用程序的高级 Python Web 框架。 版本对应 不同版本的django框架是基于特定的不同的python版本开发的&#xff0c;所以不同版本的django框架要正常执行功能只能安装特定的python版本 Django安装 安装 Django # 全局安装 pip install dj…

泰坦尼克号乘客生存情况预测分析2

泰坦尼克号乘客生存情况预测分析1 泰坦尼克号乘客生存情况预测分析2 泰坦尼克号乘客生存情况预测分析3 泰坦尼克号乘客生存情况预测分析总 背景描述 Titanic数据集在数据分析领域是十分经典的数据集&#xff0c;非常适合刚入门的小伙伴进行学习&#xff01; 泰坦尼克号轮船的…

ionic 中对Input输入框、searchbar进行solr检索

一、概述 Ionic 是一个用于开发跨平台应用程序的开源工具&#xff0c;可以使用 Angular、React 或 Vue 等前端框架。要在 Ionic 应用程序中实现实时与 Solr 通信&#xff0c;可以使用 HTTP 客户端&#xff08;如 Angular 的 HttpClient 或 Ionic 的 Native HTTP&#xff09;…

笔记:编写程序,绘制一个展示 2013~2019 财年阿里巴 巴淘宝+天猫平台的 GMV 的柱形图,实现过程如下:

文章目录 前言一、GMV 的柱形图是什么&#xff1f;二、编写代码总结 前言 编写程序。根据实例 2 的要求&#xff0c;绘制一个展示 2013~2019 财年阿里巴 巴淘宝天猫平台的 GMV 的柱形图&#xff0c;实现过程如下&#xff1a; &#xff08;1&#xff09; 导入 matplotlib.pypl…