题解:UVA1589 象棋 Xiangqi

看到代码别急着走,还要解释呢!

哈哈,知道这个题我是怎么来的吗?

和爸爸下象棋20场输17场+和2场QWQ

于是乎我就想找到一个可以自动帮我下棋的程序,在洛谷上面搜索,就搜索到了这个题。

很好奇UVA的为啥空间限制是0B。

还有,黑棋技术这么垃圾的吗……就剩光杆司令了

正文开始

问题概述

  • 给定一个残局,红方已经“将军”(delivered a check)。

  • 棋盘大小:10行 x 9列(左上角(1,1),右下角(10,9))。

  • 黑方只有一个将(general),位置给定。

  • 红方有N个棋子(2≤N≤7),包括将(G)、车(R)、炮(C)、马(H)。

  • 现在轮到黑方走棋,我们需要判断是否被“将死”(checkmate)。

  • 输入以0 0 0结束。

解决思路

  1. 理解“将死”:如果黑将无论走到哪个合法位置(上下左右,且必须在黑方九宫格内:行1-3,列4-6),都会被红方棋子攻击到,那么就是“将死”(YES);否则(存在至少一个安全位置)输出“NO”。

  2. 关键点

    • 黑将的移动:每次只能上下左右移动一格,且必须留在黑方九宫格内(行1-3,列4-6)。

    • 对于黑将的每一个可能的移动位置(最多4个方向),检查该位置是否会被任何一个红方棋子攻击。

    • 如果所有可能的位置都会被攻击,则输出"YES"(将死);否则输出"NO"。

  3. 如何判断一个位置是否被红方棋子攻击?

    • 对于每个红方棋子,根据其类型(G、R、C、H)检查是否能攻击到目标位置(黑将移动后的位置)。

    • 注意:红方棋子可能被其他棋子阻挡(车、炮、将),马有“蹩马腿”规则。

  4. 具体规则

    • 将(G):只能走一步(上下左右),且必须在红方九宫格(行1-3?实际上红将是在下方,但这里注意“飞将”规则:如果两个将在同一列且中间无棋子,红将可以飞过去攻击黑将)。

      • 检查:如果红将和黑将在同一列,且中间没有其他棋子,则可以攻击。

    • 车(R):直线移动(横竖),路径上不能有棋子阻挡(除了目标位置)。

      • 检查:如果在同一行或同一列,且中间没有棋子阻挡,则可以攻击。

    • 炮(C):直线移动,但必须跳过一个棋子( exactly one piece)才能攻击。

      • 检查:如果在同一行或同一列,且中间恰好有一个棋子(无论敌友),则可以攻击。

    • 马(H):走“日”字,有8个方向,但马腿位置(马走日的第一步方向)不能有棋子。

      • 检查:对于8个可能的方向,检查马腿位置是否无棋子,且目标位置正好是黑将位置。

  5. 实现步骤

    • 读取输入,存储红方棋子(类型和位置)。

    • 枚举黑将的4个可能的移动方向(上、下、左、右),检查是否在九宫格内。

    • 对于每个候选位置(nx, ny):

      • 如果该位置有红方棋子(会被吃掉),则跳过?实际上,如果黑将走到该位置吃掉红方棋子,那么该红方棋子就不存在了。所以我们在检查攻击时,应该排除这个被吃掉的棋子(如果存在)。

      • 创建一个棋盘网格(10x9),标记所有红方棋子的位置(除了被吃掉的这个)。

      • 遍历每个红方棋子(除了被吃掉的),检查它是否能攻击到(nx, ny)。

      • 如果任何一个红方棋子能攻击到(nx, ny),则该位置不安全。

    • 如果存在一个安全位置,则不是将死(输出NO);否则是将死(输出YES)。

#include <bits/stdc++.h>
using namespace std;
int main() {int N, NO_5, NO_70;while (cin >> N >> NO_5 >> NO_70) {if (N == 0 && NO_5 == 0 && NO_70 == 0) break;vector<tuple<char, int, int>> NO_75;for (int i = 0; i < N; i++) {char NO_78;int x, y;cin >> NO_78 >> x >> y;NO_75.push_back(make_tuple(NO_78, x, y));}int dx[] = {1, -1, 0, 0};int dy[] = {0, 0, 1, -1};bool NO_11 = false;for (int d = 0; d < 4; d++) {int nx = NO_5 + dx[d];int ny = NO_70 + dy[d];if (nx < 1 || nx > 3 || ny < 4 || ny > 6) continue;vector<vector<bool>> NO_64(11, vector<bool>(10, false));for (auto& red : NO_75) {char NO_78 = get<0>(red);int rx = get<1>(red);int ry = get<2>(red);if (rx == nx && ry == ny) continue;NO_64[rx][ry] = true;}bool NO_85 = false;for (auto& red : NO_75) {char NO_78 = get<0>(red);int rx = get<1>(red);int ry = get<2>(red);if (rx == nx && ry == ny) continue;if (NO_78 == 'G') {if (ry != ny) continue;int NO_25 = min(rx, nx);int NO_95 = max(rx, nx);int NO_112 = 0;for (int x0 = NO_25 + 1; x0 < NO_95; x0++) {if (NO_64[x0][ry]) NO_112++;}if (NO_112 == 0) {NO_85 = true;break;}} else if (NO_78 == 'R') {if (rx == nx) {int min_y = min(ry, ny);int max_y = max(ry, ny);int NO_112 = 0;for (int y0 = min_y + 1; y0 < max_y; y0++) {if (NO_64[rx][y0]) NO_112++;}if (NO_112 == 0) {NO_85 = true;break;}} else if (ry == ny) {int NO_25 = min(rx, nx);int NO_95 = max(rx, nx);int NO_112 = 0;for (int x0 = NO_25 + 1; x0 < NO_95; x0++) {if (NO_64[x0][ry]) NO_112++;}if (NO_112 == 0) {NO_85 = true;break;}}} else if (NO_78 == 'C') {if (rx == nx) {int min_y = min(ry, ny);int max_y = max(ry, ny);int NO_112 = 0;for (int y0 = min_y + 1; y0 < max_y; y0++) {if (NO_64[rx][y0]) NO_112++;}if (NO_112 == 1) {NO_85 = true;break;}} else if (ry == ny) {int NO_25 = min(rx, nx);int NO_95 = max(rx, nx);int NO_112 = 0;for (int x0 = NO_25 + 1; x0 < NO_95; x0++) {if (NO_64[x0][ry]) NO_112++;}if (NO_112 == 1) {NO_85 = true;break;}}} else if (NO_78 == 'H') {int NO_99[8][2] = {{2,1}, {2,-1}, {-2,1}, {-2,-1}, {1,2}, {1,-2}, {-1,2}, {-1,-2}};int NO_107[8][2] = {{1,0}, {1,0}, {-1,0}, {-1,0}, {0,1}, {0,-1}, {0,1}, {0,-1}};for (int i = 0; i < 8; i++) {int tx = rx + NO_99[i][0];int ty = ry + NO_99[i][1];if (tx < 1 || tx > 10 || ty < 1 || ty > 9) continue;int hx = rx + NO_107[i][0];int hy = ry + NO_107[i][1];if (hx < 1 || hx > 10 || hy < 1 || hy > 9) continue;if (!NO_64[hx][hy] && tx == nx && ty == ny) {NO_85 = true;break;}}if (NO_85) break;}}if (!NO_85) {NO_11 = true;break;}}cout << (NO_11 ? "NO" : "YES") << endl;}return 0;
}

dx&&dy:黑将可以移动的方向

钠(NO_11):判断

if (rx == nx && ry == ny) continue:如果这个红子正好在黑将移动的位置上,则会被吃掉,所以不标记(我和AI下象棋就是这样丢了一个砲QWQ)

砹(NO_85):该位置是否被攻击

if (rx == nx && ry == ny) continue;如果这个红子被吃掉,则跳过

if (count == 0) { 无阻挡,可以攻击

然后就是噼里啪啦一顿程序,分别判断 将 車 炮 马

注意马的撇腿(如果象也加入那么还要撇象眼)。

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

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

相关文章

基于YOLOv11的脑卒中目标检测及其完整数据集——推动智能医疗发展的新机遇!

在当今科技迅速发展的时代&#xff0c;脑卒中作为一种严重威胁人类健康的疾病&#xff0c;其早期的检测和及时的干预显得尤为重要。为此&#xff0c;本项目推出基于YOLOv11的脑卒中目标检测系统&#xff0c;结合完整的数据集&#xff0c;不仅提高了检测的效率&#xff0c;更为医…

sed——Stream Editor流编辑器

文章目录前言一、什么是sed二、sed的原理2.1 sed工作流程的三个步骤2.2 sed的两个重要空间&#xff1a;2.3 sed的具体运作流程三、sed的常见用法3.1 sed的基本格式3.2 常用选项3.3 常用操作3.3.1 基本语法规则3.3.2 常用操作命令3.4 操作用法示例3.4.1 输出符合条件的文本&…

Zotero白嫖腾讯云翻译

Zotero白嫖腾讯云无限制字数翻译 文章目录Zotero白嫖腾讯云无限制字数翻译1、安装插件1、登录腾讯云2、找到访问管理进入3、创建一个子用户4、启用机器翻译功能5、复制秘钥6、设置到Zotero1、安装插件 zotero-pdf-translate&#xff1a;https://github.com/windingwind/zotero…

TCP多进程和多线程并发服务

进程和线程的区别&#xff1a; 详细的可以参考这样文档进程和线程的区别(超详细)-CSDN博客 核心比喻 进程 一个工厂&#xff1a;这个工厂拥有独立的资源&#xff08;厂房、原材料、资金、电力&#xff09;。每个工厂之间是相互隔离的&#xff0c;一个工厂着火…

计算机毕业设计springboot基于Java+Spring的疫苗接种管理系统的设计与实现 基于Spring Boot框架的疫苗接种信息管理系统开发与应用 Java与Spring技术驱动的疫苗接种管理

计算机毕业设计springboot基于JavaSpring的疫苗接种管理系统的设计与实现69geq9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;计算机技术在…

C/C++圣诞树①

写在前面 圣诞节将至&#xff0c;我总想用代码做点什么&#xff0c;来表达对这个温馨节日的敬意。于是&#xff0c;我决定用C语言在控制台中绘制一幅充满节日气氛的圣诞树画面。它不仅有闪烁的雪花、五彩的灯光&#xff0c;还有一颗颗精心雕琢的心形图案&#xff0c;仿佛把整个…

【小白入】显示器核心参数对比度简介

对比度是一个非常核心的显示器参数。下面我们来了解一下。一、核心定义&#xff1a;什么是对比度&#xff1f;显示器的对比度&#xff08;Contrast Ratio&#xff09;是指其最亮状态&#xff08;白色&#xff09;与最暗状态&#xff08;黑色&#xff09;之间的亮度比值。简单来…

【项目】多模态RAG必备神器—olmOCR重塑PDF文本提取格局

【项目】多模态RAG必备神器—olmOCR重塑PDF文本提取格局&#xff08;一&#xff09;olmOCR是什么&#xff1f;&#xff08;二&#xff09;olmOCR 的核心技术&#xff08;1&#xff09;文档锚定技术&#xff08;2&#xff09;微调 7B 视觉语言模型&#xff08;三&#xff09;olm…

解决Android Studio查找aar源码的错误

我又来给大模型贡献素材了&#xff01; 问题 在更新了Android Studio Narwhal Feature Drop | 2025.1.2 Patch 1版本之后&#xff0c;遇到了一个问题&#xff0c;很烦人&#xff01;AS每次更新都能搞出点新毛病&#xff0c;真的服了。使用离线依赖aar包引入某个库之后&#xff…

华为HCIP、HCIE认证:自学与培训班的抉择

大家好&#xff0c;这里是G-LAB IT实验室。 在追求个人职业发展的道路上&#xff0c;取得华为的HCIP或HCIE认证是许多IT从业者的重要目标之一。 但在备考过程中&#xff0c;我们常常面临一个选择&#xff1a;是自学还是报名参加培训班&#xff1f;本文将针对这个问题&#xff0…

空调噪音不穿帮,声网虚拟直播降噪技巧超实用

虚拟主播团队负责人来吐槽&#xff01;实时互动是核心&#xff0c;可主播回应慢半拍、动作表情跟不上语音&#xff0c;用户立马觉得假&#xff0c;哗哗流失。之前方案端到端延迟 700ms&#xff0c;互动总慢一步。直到接入商汤日日新大模型和声网合作方案&#xff0c;延迟压到 5…

Spark和Spring整合处理离线数据

如果你比较熟悉JavaWeb应用开发&#xff0c;那么对Spring框架一定不陌生&#xff0c;并且JavaWeb通常是基于SSM搭起的架构&#xff0c;主要用Java语言开发。但是开发Spark程序&#xff0c;Scala语言往往必不可少。 众所周知&#xff0c;Scala如同Java一样&#xff0c;都是运行…

智能高效内存分配器测试报告

一、项目背景 这个项目是为了学习和实现一个高性能、特别是高并发场景下的内存分配器。这个项目是基于谷歌开源项目tcmalloc(Thread-Caching Malloc)实现的。tcmalloc 的核心目标就是替代系统默认的 malloc/free&#xff0c;在多线程环境下提供更高效的内存管理。C/C的malloc虽…

吱吱企业通讯软件以安全为核心,构建高效沟通与协作一体化平台

随着即时通讯工具日益普及&#xff0c;企业面临一个严峻的挑战&#xff1a;如何在保障通讯数据安全的前提下&#xff0c;提升办公效率&#xff1f;为解决此问题&#xff0c;吱吱企业通讯软件诞生&#xff0c;通过私有化部署和深度集成的办公系统&#xff0c;为企业打造一个既可…

校企合作| 长春大学旅游学院副董事长张海涛率队到访卓翼智能,共绘无人机技术赋能“AI+文旅”发展新蓝图

为积极响应国务院《关于深入实施“人工智能”行动的意见》&#xff08;国发〔2025〕11号&#xff09;号召&#xff0c;扎实推进学校“旅游”与“人工智能”双轮驱动的学科发展战略&#xff0c;加快无人机技术在文旅领域的创新应用&#xff0c;近日长春大学旅游学院副董事长张海…

为什么要用 MarkItDown?以及如何使用它

在处理大量文档时&#xff0c;尤其是在构建知识库、进行文档分析或训练大语言模型&#xff08;LLM&#xff09;时&#xff0c;将各种格式的文件&#xff08;如 PDF、Word、Excel、PPT、HTML 等&#xff09;转换为统一的 Markdown 格式&#xff0c;能够显著提高处理效率和兼容性…

LVGL9.3 vscode 模拟环境搭建

1、git 克隆&#xff1a; git clone -b release/v9.3 https://github.com/lvgl/lv_port_pc_vscode.git 2、cmake 和 mingw 环境搭建 cmake&#xff1a; https://blog.csdn.net/qq_51355375/article/details/139186681?spm1011.2415.3001.5331 mingw&#xff1a; https://bl…

投影矩阵:计算机图形学中的三维到二维转换

投影矩阵是计算机图形学中的核心概念之一&#xff0c;它负责将三维场景中的几何数据投影到二维屏幕上&#xff0c;从而实现三维到二维的转换。无论是游戏开发、虚拟现实&#xff0c;还是3D建模&#xff0c;投影矩阵都扮演着不可或缺的角色。本文将深入探讨投影矩阵的基本原理、…

10.2 工程学中的矩阵(2)

十、例题 【例3】求由弹簧连接的 100100100 个质点的位移 u(1),u(2),...,u(100)u(1),u(2),...,u(100)u(1),u(2),...,u(100), 弹性系数均为 c1c 1c1, 每个质点受到的外力均为 f(i)0.01f(i)0.01f(i)0.01. 画出两端固定和固定-自由这两种情形 u 的图形。 解&#xff1a; % 参数设…

Mysql主从复制之延时同步

1.延时同步概念通过人为配置从库和主库延时N小时可以实现延时同步&#xff0c;延时同步可以解决数据库故障出现的数据丢失问题(物理损坏如直接使用rm删除数据库数据和逻辑损坏如使用drop命令删除数据库)2.延时同步实操2.1先配置从库延时同步&#xff0c;并且设置sql线程300秒后…