Codeforces Round 217 (Div. 2) A. Rook, Bishop and King(BFS)

Rook, Bishop and King

题面翻译

【题目描述】

佩蒂亚正在学习国际象棋。他已经学会如何移动王、车和象。让我们提示你如何移动国象棋子。棋盘有 64 64 64个棋格,呈 8 × 8 8\times8 8×8正方形。一个格子可以用 ( r , c ) (r,c) (r,c)来表示—— r r r指行, c c c指列(虽然在经典棋局中用字母和数字一起表示)。每一个棋子占用一个棋格。一次合法的棋步就是执行如下之一:

  • 车可以横向或纵向移动任意格。
  • 象可以斜着移动任意格。
  • 王可以任意方向移动一格——横着或者斜着。

佩蒂亚在想,从 ( r 1 , c 1 ) (r_1,c_1) (r1,c1)移动到 ( r 2 , c 2 ) (r_2,c_2) (r2,c2)所需的最少步数是多少?我们假设在棋盘上只有一枚棋子。帮他解决问题。

【输入格式】

输入包括四个整数 r 1 , c 1 , r 2 , c 2 ( 1 < = r 1 , c 1 , r 2 , c 2 < = 8 ) r_1,c_1,r_2,c_2(1<=r_1,c_1,r_2,c_2<=8) r1,c1,r2,c2(1<=r1,c1,r2,c2<=8)——分别代表出发的棋格和目的地棋格。数据保证两个格子不相同。你可以假设棋盘的行从上到下是 1 1 1 8 8 8,棋盘从左到右是 1 1 1 8 8 8

【输出格式】

输出三个用空格分隔的整数,分别代表车、象、王从 ( r 1 , c 1 ) (r_1,c_1) (r1,c1)移动到 ( r 2 , c 2 ) (r_2,c_2) (r2,c2)所需的最少步数。如果无法移动到,则输出 0 0 0

题目描述

Little Petya is learning to play chess. He has already learned how to move a king, a rook and a bishop. Let us remind you the rules of moving chess pieces. A chessboard is 64 square fields organized into an $ 8×8 $ table. A field is represented by a pair of integers $ (r,c) $ — the number of the row and the number of the column (in a classical game the columns are traditionally indexed by letters). Each chess piece takes up exactly one field. To make a move is to move a chess piece, the pieces move by the following rules:

  • A rook moves any number of fields horizontally or vertically.
  • A bishop moves any number of fields diagonally.
  • A king moves one field in any direction — horizontally, vertically or diagonally.

The pieces move like thatPetya is thinking about the following problem: what minimum number of moves is needed for each of these pieces to move from field $ (r_{1},c_{1}) $ to field $ (r_{2},c_{2}) $ ? At that, we assume that there are no more pieces besides this one on the board. Help him solve this problem.

输入格式

The input contains four integers $ r_{1},c_{1},r_{2},c_{2} $ ( $ 1<=r_{1},c_{1},r_{2},c_{2}<=8 $ ) — the coordinates of the starting and the final field. The starting field doesn’t coincide with the final one.

You can assume that the chessboard rows are numbered from top to bottom 1 through 8, and the columns are numbered from left to right 1 through 8.

输出格式

Print three space-separated integers: the minimum number of moves the rook, the bishop and the king (in this order) is needed to move from field $ (r_{1},c_{1}) $ to field $ (r_{2},c_{2}) $ . If a piece cannot make such a move, print a 0 instead of the corresponding number.

样例 #1

样例输入 #1

4 3 1 6

样例输出 #1

2 1 3

样例 #2

样例输入 #2

5 5 5 6

样例输出 #2

1 0 1

这道题和普通的BFS并无太大区别,在做的时候我会想到开一个结构体来记录坐标,步数和前一步操作,这个方法对于Rook和King都适用,但是对Bishop不行

Bishop的移动过程是斜着移动多个距离,如果一个一个坐标的进行遍历,就会导致有些坐标会被封堵上,这样就导致有些情况是无法被扫出来的。

所以这道题BFS的正解其实是每次都遍历完路径上能够到达的所有点。

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 15;
const int Rook_dx[4] = {1,-1,0,0};
const int Rook_dy[4] = {0,0,1,-1};
const int Bishop_dx[4] = {1,1,-1,-1};
const int Bishop_dy[4] = {1,-1,1,-1};
const int King_dx[8] = {1,0,-1,0,1,1,-1,-1};
const int King_dy[8] = {0,1,0,-1,1,-1,1,-1};
struct Node{int x,y;int step;int pre;
};
int r1,c1,r2,c2;
bool vis[N][N];int bfs(int type){ //1:Rook,2"Bishop,3"Kingmemset(vis,0,sizeof vis);int res = 2e9;queue<Node>q;q.push({r1,c1,0,10});vis[r1][c1] = 1;while(q.size()){Node t = q.front();q.pop();if(t.x == r2 && t.y == c2)return t.step;//cout << t.x << " " << t.y << " " << t.step << endl;if(type == 1){for(int i = 0;i < 4;i++){int x = t.x + Rook_dx[i],y = t.y + Rook_dy[i];if(x >= 1 && x <= 8 && y >= 1 && y <= 8 && !vis[x][y]){vis[x][y] = 1;if(t.pre == i) q.push({x,y,t.step,i});else q.push({x,y,t.step + 1,i});}}}else if(type == 2){for(int i = 0;i < 4;i++){int x = t.x,y = t.y;while(x <= 8 && x >= 1 && y <= 8 && y >= 1){	//在没有超过边界的时候一直去走if(!vis[x][y]){q.push({x,y,t.step + 1,i});vis[x][y] = 1;}x += Bishop_dx[i],y += Bishop_dy[i];}}}else{for(int i = 0;i < 8;i++){int x = t.x + King_dx[i],y = t.y + King_dy[i];if(x >= 1 && x <= 8 && y >= 1 && y <= 8 && !vis[x][y]){vis[x][y] = 1;q.push({x,y,t.step + 1,i});}}}}if(res == 2e9)return 0;else return res;
}int main(){cin >> r1 >> c1 >> r2 >> c2;//bfs(2);cout << bfs(1) << " " << bfs(2) << " " << bfs(3) << " ";return 0;
}

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

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

相关文章

Stable Diffusion的技术原理

一、Stable Diffusion的技术原理 Stable Diffusion是一种基于Latent Diffusion Models&#xff08;LDMs&#xff09;实现的文本到图像&#xff08;text-to-image&#xff09;生成模型。其工作原理主要基于扩散过程&#xff0c;通过模拟数据的随机演化行为&#xff0c;实现数据…

回表的原理竟然这么简单

“回表” 是指在使用辅助索引&#xff08;非聚簇索引&#xff09;作为条件进行查询时&#xff0c;由于辅助索引中只存储了索引字段的值和对应的主键&#xff08;聚簇索引&#xff09;键值&#xff0c;因此需要根据主键&#xff08;聚簇索引&#xff09;中的键值去查找实际的数据…

verilog中含有无关项的序列检测

编写一个序列检测模块&#xff0c;检测输入信号a是否满足011XXX110序列&#xff08;长度为9位数据&#xff0c;前三位是011&#xff0c;后三位是110&#xff0c;中间三位不做要求&#xff09;&#xff0c;当信号满足该序列&#xff0c;给出指示信号match。 程序的接口信号图如…

vue+onlyOffice+java : 集成在线编辑word并保存

1.docker部署onlyOffice 1.1拉取最新版onlyOffice镜像 sudo docker pull onlyoffice/documentserver 1.2运行以下命令运行容器 其中 -v 后的第一部分是挂载自己的linux的哪个目录 # 启动docker容器&#xff0c;默认启动端口为80&#xff0c;可以进行修改 docker run -i -t …

[补题记录] StarryCoding 入门教育赛3 D.电弧陷阱

URL&#xff1a;小白教育赛3 题目描述 劳 e e e和桶子在打派的时候被一个艾许的电弧陷阱控在原地动弹不得&#xff0c;于是他们想办法找出哪些地方是可以去的&#xff0c;哪些地方是不能去的。 给定一个由字符构成的 N ∗ M N * M N∗M的矩阵&#xff0c;其中包括&#xff1…

Python 中的 Lambda 函数:简单、快速、高效

大家好&#xff0c;今天再给大家介绍一个python的一个强大工具Lambda 函数&#xff0c;它允许你快速定义简单的匿名函数。这种函数是“匿名的”&#xff0c;因为它们不需要像常规函数那样被明确命名。 在本文中&#xff0c;我们将通过清晰的解释和实用的示例&#xff0c;深入了…

基于GIS地理技术+智慧巡检解决方案(Word原件)

传统的巡检采取人工记录的方式&#xff0c;该工作模式在生产中存在很大弊端&#xff0c;可能造成巡检不到位、操作失误、观察不仔细、历史问题难以追溯等现象&#xff0c;使得巡检数据不准确&#xff0c;设备故障隐患得不到及时发现和处理。因此建立一套完善的巡检管理系统是企…

Redis 数据操作与故障排除指南

Redis 是一个高性能的键值数据库&#xff0c;广泛用于缓存、会话管理等多种场景。当你在使用 Redis 时遇到 nil 值或其他问题&#xff0c;可能是因为你没有正确地定位到数据所在的数据库或节点。本文将帮助你理解如何在 Redis Cluster 或多数据库环境中正确操作和解决常见问题。…

【2022 深圳 ArchSummit 】大数据架构稳定性保障实践

文章目录 一、前言二、现状三、大数据架构的历史变迁&#xff08;一&#xff09;洪荒期&MR&#xff08;二&#xff09;远古期&MPP&#xff08;四&#xff09;近现代&Flink/Spark&#xff08;五&#xff09;现如今&实时数据湖架构 四、架构稳定的关键因素&#…

编程式导航

目录 一、问题引入 二、基本跳转 1.path路径跳转&#xff08;简易方便&#xff09; 2.name命名路由跳转&#xff08;适合path路径长的场景&#xff09; 三、路由传参 1.path路径跳转传参 &#xff08;1&#xff09;query传参 &#xff08;2&#xff09;动态路由传参 2.…

C语言UDP网络编程

目录 1. C语言UDP编程简介 1.1 背景与意义 1.2 UDP协议简介 1.3 C语言在网络编程中的应用 2. UDP网络编程基础 2.1 套接字编程概念 2.2 UDP套接字创建与绑定 2.3 数据发送与接收 2.4 关闭套接字 3. C语言UDP编程实例 3.1 简单聊天室 3.2 文件传输程序 3.3 广播消息…

后端返回文件流格式,前端vue 导出下载表格

//日期时间格式化 export const formatDate (edate, type) > { var date new Date(edate); var year date.getFullYear(); //年 var month date.getMonth() 1 < 10 ? "0" (date.getMonth() 1) : date.getMonth() 1; //月 var day date.getDate() &l…

家装新宠!装修APP开发解决方案,为业主提供全新装修模式

随着人们对家庭装修的需求度越来越高&#xff0c;装修APP开发也随之出现。如今装修APP开发可实现互联网与传统家装行业的信息结合&#xff0c;由传统的家装行业广告模式向移动端的互联网模式进行转移&#xff0c;实现传统家装行业与互联网的相辅相成&#xff0c;以此来推动家装…

电商核心技术揭秘54: 粉丝经济的挖掘与利用

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

2024年华为OD机试真题-螺旋数字矩阵-C++-OD统一考试(C卷D卷)

题目描述: 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m(0 < n ≤ 999,0 < m ≤ 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3...n,最终形成一个m行矩阵。 小明对这个矩阵有些要求: 1.每行数字的…

一、数据结构的三要素

数据的存储结构&#xff1a;顺序&#xff08;物理位置相邻&#xff09;、链式&#xff08;物理位置不相邻&#xff09;、索引&#xff08;还需要建立索引表&#xff09;、散列&#xff08;根据关键字直接计算出该元素的存储地址又称为hash存储&#xff09;、 时间复杂度&#x…

接口(Interface)和抽象类(Abstract Class)编程思想

目录 抽象类(Abstract Class)编程思想 接口(Interface)编程思想 接口(Interface)和抽象类(Abstract Class)是面向对象编程(OOP)中的两个重要概念,它们都是用于实现代码重用和定义共同行为的方式,但各自有其独特的应用场景和编程思想。 抽象类(Abstract Class)编程思…

6.5.Docker数据管理和端口映射应用

文章目录 实战总体步骤案例1:安装tomcat&#xff08;端口映射使用&#xff09;案例2:安装mysql&#xff08;数据卷应用&#xff09;测试版实战版 案例3:安装Redis&#xff08;数据卷应用&#xff09; 实战总体步骤 搜索镜像 可以在Dockerhub中查看容器如何使用&#xff0c;包括…

js原生三种弹框

第一种&#xff1a; alert("提示内容")&#xff1a;提示弹框&#xff1b; alert("提示"); 第二种&#xff1a; prompt("内容","输入框默认值")&#xff1a;输入弹框&#xff0c;第一个值输入框提示内容&#xff0c;第二个值输入框默…

23种设计模式——责任链

责任链模式是一种行为设计模式&#xff0c;它允许将请求沿着处理链传递&#xff0c;直到有一个处理者能够处理该请求为止。责任链模式将请求的发送者和接收者解耦&#xff0c;使得多个对象都有机会处理请求&#xff0c;同时也可以动态地组织和修改处理链。 在责任链模式中&…