hdu4121 判断黑帅下一步会不会被红棋将军(分类讨论)

c++课设--基于QT实现的象棋 组员姓名:XXXX通过这次课程设计,更加深入的了解了 qt的使用,以及掌握了C++语言的基本语法和面向对象编程思想,同时通过实践来加深对C++语言的理解和应用。通过这次的课设一定程度上提高了自己的编程能力,能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,能够熟练地使用C++的特点继承,封装,多态,加深对面向对象编程思想的理解,同时也为学习其他高级语言和开发其他复杂应用程序打下坚实的基础。 阅读详情

放了一个月的东西终于AC了。考虑的问题很多,由于跟网上的大神思路不一样所以看不了题解,只能自己推敲错误的原因睡觉

错误原因一:把象棋里马蹩脚的情况弄错了。这属于常识原因。

错误原因二:计算的时候没有把被黑帅吃掉的棋子去掉。。

错误原因三:在计算两个帅在同一竖线的情况时搞混了,应该既要判断黑帅走完后还有没有在同一竖线又要判断在被吃/没被吃之后的此时红黑帅有没有正面交锋。

中国象棋规则:http://jingyan.baidu.com/album/642c9d34a95995644b46f770.html?picindex=1

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4121

#include<iostream>
#include<algorithm>
#include<string>
#include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};
#include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;}
#include<vector>
#include<cmath>
#include<queue>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define mod 1000000007
#define ll long long
using namespace std;
int ss;
int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};
int mx[8]={-2,-2,-1,1,2,2,-1,1};
int my[8]={-1,1,-2,-2,-1,1,2,2};
//int ban1x[8]={-1,-1,-1,-1,1,1,1,1};
//int ban1y[8]={-1,1,-1,1,-1,1,-1,1};
int ban2x[8]={-1,-1,0,0,1,1,0,0};
int ban2y[8]={0,0,-1,-1,0,0,1,1};
vector<pair<int,int> >shuai,ju,ma,pao,suoyou;
pair<int,int> chidiao; //被将的下一步吃掉的位置 
int judge(int a,int b){
    for(int i=0;i<ju.size();++i){
        if(ju[i].first==chidiao.first&&ju[i].second==chidiao.second)
            continue;
        if(a==ju[i].first){
            int u=0;
            for(int j=0;j<suoyou.size();++j){
            	if(suoyou[j].first==chidiao.first&&suoyou[j].second==chidiao.second)
            		continue;
                if(suoyou[j].first==a&&suoyou[j].second>min(b,ju[i].second)&&suoyou[j].second<max(b,ju[i].second)){
                    u=1;
                    break;
                }
            }
            if(u==0)
                return 0;
        }
        else if(b==ju[i].second){
            int u=0;
            for(int j=0;j<suoyou.size();++j){
            	if(suoyou[j].first==chidiao.first&&suoyou[j].second==chidiao.second)
            		continue;
                if(suoyou[j].second==b&&suoyou[j].first>min(a,ju[i].first)&&suoyou[j].first<max(a,ju[i].first)){
                    u=1;
                    break;
                }
            }
            if(u==0)
                return 0;
        }
    }
    for(int i=0;i<ma.size();++i){
        if(ma[i].first==chidiao.first&&ma[i].second==chidiao.second)
            continue;
        for(int j=0;j<8;++j){
//            int i1=ma[i].first+ban1x[j],j1=ma[i].second+ban1y[j];
            int i2=ma[i].first+ban2x[j],j2=ma[i].second+ban2y[j];
            int u=0;
            for(int k=0;k<suoyou.size();++k){
            	if(suoyou[k].first==chidiao.first&&suoyou[k].second==chidiao.second)
            		continue;
//                if(suoyou[k].first==i1&&suoyou[k].second==j1){
//                    u=1;
//                    break;
//                }
//                else 
				if(suoyou[k].first==i2&&suoyou[k].second==j2){
                    u=1;
                    break;
                }
            } 
            if(u==1)
                continue;
            int ii=ma[i].first+mx[j],jj=ma[i].second+my[j];
            if(ii==a&&jj==b)
                return 0; 
        }
    }
    for(int i=0;i<pao.size();++i){
        if(pao[i].first==chidiao.first&&pao[i].second==chidiao.second)
            continue;
        if(pao[i].first==a){
            int s=0;
            for(int j=0;j<suoyou.size();++j){
            	if(suoyou[j].first==chidiao.first&&suoyou[j].second==chidiao.second)
            		continue;
                if(suoyou[j].first==a&&suoyou[j].second>min(pao[i].second,b)&&suoyou[j].second<max(pao[i].second,b))
                    s++;
                if(s>=2)
                    break;
            }
            if(s==1)
                return 0;
        }
        else if(pao[i].second==b){
            int s=0;
            for(int j=0;j<suoyou.size();++j){
            	if(suoyou[j].first==chidiao.first&&suoyou[j].second==chidiao.second)
            		continue;
                if(suoyou[j].second==b&&suoyou[j].first>min(pao[i].first,a)&&suoyou[j].first<max(pao[i].first,a))
                    s++;
                if(s>=2)
                    break;
            }
            if(s==1)
                return 0;
        }
    }
    return 1;
}
int cover(int a,int b){
    for(int i=0;i<4;++i){
    	chidiao=make_pair(-1,-1); 
        int ii=a+dx[i],jj=b+dy[i];
   //     cout<<ii<<" "<<jj<<endl;
        if(ii>=1&&ii<=3&&jj>=4&&jj<=6){  //帅只有一个 
        	int u=0;
            for(int j=0;j<suoyou.size();++j){
                if(suoyou[j].second==jj&&suoyou[j].first==ii){
                    u=1;
                    if(jj==shuai[0].second)
                    	u=2;
                    break;
                }
            }
            if((u==2&&ss-1==1)||(jj==shuai[0].second&&ss==1))
                continue;
	        if(u==1)
	        	chidiao=make_pair(ii,jj); 
	        if(judge(ii,jj)){
	            return 0; //将可以走这一格,不会将死 
	        }    
        }
    }
    return 1; 
}
int main(){
    int n,a,b,aa,bb;
    char c;
    while(cin>>n>>a>>b&&(n||a||b)){
        ss=0;
        shuai.clear();ju.clear();ma.clear();pao.clear();suoyou.clear();
        while(n--){
            cin>>c>>aa>>bb;
            if(c=='G')
                shuai.push_back(make_pair(aa,bb));
            else if(c=='R')
                ju.push_back(make_pair(aa,bb));
            else if(c=='H')
                ma.push_back(make_pair(aa,bb));
            else
                pao.push_back(make_pair(aa,bb));
            suoyou.push_back(make_pair(aa,bb));
        }
        for(int i=0;i<suoyou.size();++i){
            if(suoyou[i].second==shuai[0].second)
                ss++;
        }
        if(shuai[0].second==b&&ss==1)
            cout<<"NO"<<endl;
        else if(cover(a,b)==1) //会被将死
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl; 
    }
    return 0;
}


OpenIddict实战:5步搞定.NET Core应用的OIDC单点登录集成 本文详细介绍了如何使用OpenIddict在.NET Core应用中快速实现OIDC单点登录集成。通过五个关键步骤,包括环境准备、数据库集成、客户端注册、令牌配置和多应用SSO集成,帮助开发者高效构建安全的企业级单点登录解决方案。 阅读详情

相关推荐

Monocle2在R 4.3环境下的终极避坑指南:从安装到可视化全流程解析

本文提供了在R 4.3环境下安装和运行Monocle2的完整解决方案,重点解决了依赖包兼容性、源码修改及BEAM分析报错等关键问题。文章详细解析了从环境准备、依赖包处理、源码安装验证到从Seurat对象转换、拟时轨迹构建、高级可视化及性能优化的全流程,旨在帮助用户顺利完成单细胞拟时分析。

weixin_29206669的博客 1355

Android studio中国象棋,下棋思路与代码实现

中国象棋采用PVS+置换表+历史表实现

weixin_46409629的博客 2005

Dify+MCP 双剑合璧:告别知识库模糊统计,让AI精准查询数据库数据!

本文详细介绍了如何通过Dify和MCP的结合,解决知识库在数据库查询中的模糊统计问题。通过MCP中间件将自然语言实时转换为SQL语句,实现精准数据查询,并支持SSE协议持续更新数据。文章包含MySQL环境搭建、MCP服务端部署、Dify工作流配置等实战步骤,帮助用户高效构建智能数据库查询系统。

weixin_33737774的博客 369

使用Qt开发中国象棋(六):将军和死棋检测

下棋的过程中,某一方主帅被对方攻击就是将军,如果不能解除危险,就是死棋。在这个游戏中实现了将军的判断和死棋的检测。具体如下:         (1)每走一步棋时,先要判断自己能不能这样走,当然除了走法是否合乎规则,比如说是否为蹩脚马等等,还要判断自己这样走是否被对方将军。         (2)走完一步棋后,还要判断是否将对方的军,是否造成对方死棋。 首先介绍一下将军的判断方法:能够将军的无

身是菩提树,心如明镜台。时时勤擦拭,勿使惹尘埃。 3415

告别‘线束丛林’:手把手拆解车身域控制器(BCM/PEPS/网关)的硬件选型与PCB布局要点

本文深入解析车身域控制器的硬件选型与PCB布局要点,涵盖主控MCU选择、通信接口设计、电源架构优化及EMC设计等关键环节。通过实战案例分享,帮助工程师解决高密度集成带来的电源完整性、热管理和信号隔离挑战,实现更稳定高效的汽车电子系统设计。

weixin_42567279的博客 394

UOS系统手动添加1920x1080分辨率:xrandr命令详解与持久化配置

本文详细介绍了在UOS系统中使用xrandr命令手动添加1920x1080分辨率的方法。针对系统设置中缺失该选项的常见问题,文章提供了从识别显示设备、使用cvt生成模式、添加并切换分辨率,到通过修改.profile文件实现持久化配置的完整步骤。同时涵盖了虚拟机环境、设备名识别及排错等进阶内容,帮助用户彻底解决UOS分辨率配置难题。

weixin_29300931的博客 499

hdu 4121 “将军”状态判断

http://acm.hdu.edu.cn/showproblem.php?pid=4121 纯模拟... #include #include #include #include #include #include #include #include #include #include using namespace std; #define RD(x

u012774187的专栏 547

携程机票数据爬取实战:使用 Python 获取携程网机票信息

通过本篇博客,我们详细介绍了如何使用 Python 爬取携程网的机票信息,涉及了静态网页爬取(使用 Requests 和 BeautifulSoup)和动态网页爬取(使用 Selenium)两种方法。通过获取的数据,我们不仅能够进行票价分析,还可以构建更为复杂的预测模型或趋势分析工具。爬虫技术不仅能够帮助我们收集有价值的数据,还能够为商业决策提供数据支持。在实际应用中,我们可以结合更多的分析方法,如自然语言处理、图像处理等,进一步提升数据的价值。

2201_76125261的博客 1657

UVA1589(HDU4121)

Xiangqi is one of the most popular two-player board games in China. The game represents a battle between two armies with the goal of capturing the enemy’s “general” piece. In this problem, you are giv

qq_37751662的博客 283

注意力机制与经典 CV 网络:PyTorch 实现与实战

注意力机制(SE/空间/CBAM/Non-Local)通过权重重标定让模型聚焦关键特征,经典 CNN(ResNet/DenseNet/FPN)提供了深层网络、特征复用和多尺度融合的基础骨架。建议先在 ResNet 上插入 SE 模块(通道注意力)做基线实验,再根据任务类型引入空间注意力(分割任务)或非局部注意力(视频任务)。CIFAR-10 数据集适合快速验证注意力模块的有效性,迁移到更大数据集时保持相同的结构设计思路即可。

FJN110的博客 62

《Python全栈系列教程》专栏介绍及文章汇总

《Python全栈系列教程》专栏介绍及文章汇总

孤寒者的博客 71万+

HDU 4121(非常纠结的模拟)

起初是模拟红棋子能到达的都标记出来,然后判断黑棋子无法走了,就说明输了。但是这种想法是错的,因为红子在改动的时候回去影响其他棋子的范围,比较麻烦,还有的就是黑方可能把红色的棋子吃掉,从而黑方也不会输的。       唉,还是太年轻了,还有的思路:直接枚举黑方能到达的点,然后判断红方是否到达不就行了庅,非常简便。为啥开始想不到这个呢?这道是非常简单的现场赛题了,还很远。 #include #

Weiguang_123的专栏 1594

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

hdu4121 xiangqi

模拟题 黑方只有一个将,决定是否被死将,规则和普通象棋一致 注意细节就没什么难的 我是先判断能否飞将。然后判断走四个方向后会不会被将死 这里需要注意一点,移动后可能会吃掉红方一颗棋子,那么这颗棋子就不需要判断 //#pragma warning (disable: 4786) //#pragma comment (linker, "/STACK:16777216") //HE

Colin_27的专栏 855

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

hdu4121 poj4001 Xiangqi(模拟)

模拟题考验coding能力,一定要思路清晰,按照模块化思想,有哪些情况,需要哪些功能都要事先分析好了。高手的模拟题代码往往结构很清晰,功能模块写成函数,没有过多重复代码,让人一看便明。 方法选择的好坏会影响编程复杂度,这题老将最多只能往四个位置走,就枚举这四个位置,每个位置再枚举每个红子看是不是有子能吃了它。枚举时注意有可能老将这一步吃了一个红子。 有一种情况是一开始双方老将就见面,这其实不叫...

weixin_30248399的博客 142

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

POJ4001/HDU4121 Xiangqi 大模拟

这其实就是一道无脑模拟题。。首先黑方将有四个位置可以走(上下左右)(如果可以走的话),那么就分别模拟走到这四个位置,然后判断会不会被红方将军。如果被红方以任一方式将军则在这种情况下被将死。如果四种走位都会被将死,则输出YES,即黑方彻底玩完。一个我认为的Trick是如果一开始黑方还没走的时候就可以飞将红方,那么此时直接输出NO就好了(不用走,直接黑房赢了),测试样例应该是没有这样的样例的,不过我还是

fawks96的专栏 691

HDU 4121

水题  读入炮,马,将,车 判断是否能将军 模拟一下所有会被将军的位置即可 #include "stdio.h" #include "string.h" #include "math.h" #include "stdlib.h" struct comp { int x,y; char ch[10]; } data[10010]; int hash[101][101],

695

2011福州赛区区域赛 - A - Xiangqi - HDU - 4121

/*好恶心的一道题,说明自己细节考虑得还不够。最恨的就是这种不难的题还做不对。 经过7个小时的苦苦检查后,终于找到了错误的地方,棋盘恢复上一状态的时候竟然只恢复了一个点, 太傻了!!!改过之后终于AC了。 1.需要考虑红子被黑将吃掉的情况。 2.考虑飞将军的情况。 把能杀掉的点都标记为-1,有棋子的点为1,其余点为0. 穷举黑将走的4个方向,若4个方向的标记都为-1(能被杀掉),则被将死,否则将不

920

hdu 4121 xiangqi 模拟

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4121 康复训练 小模拟 几个坑: 1.黑general可以通过飞过来吃掉红general来摆脱困境 2.可能需要注意某些棋子被黑general吃掉的情况 本质是搜索 这种题完全不可能卡时间 将、车、炮用一种判法 马另用一种判法 #include ...

weixin_30786617的博客 123

HDU 4121 Xiangqi 模拟

原题: http://acm.hdu.edu.cn/showproblem.php?pid=4121题目大意: 对于给定的棋盘,黑棋只有一个,红棋有n个,现在黑将可以走一步,如果怎么走都活不了,就是被将死了,输出YES。这道题我们只需要模拟每个红棋的攻击范围,最后看黑将的能走的地方是否在攻击范围就可以了。#include <iostream> #include"cstdio" #include"

ShineRoyal 664

hdu 4121 模拟

这题有点坑而已。。。但不算很坑。。。 先吐槽些省赛的事,只能用蒟蒻来形容,代码能力渣,尤其是模拟题上手是没有自信。。。平时题目刷的也不够,方向还特别的窄,╮(╯▽╰)╭ 回来后被严重B视了。。好在有些人还是比较理解咱这个马上要考TG的狗。。。 好,回到正式正题,这道题题意简单,就是判断当前的黑方是不是彻底OVER了。。。象棋规则省略。这种在坐标上的模拟题,首先要看看他的X,Y代表什么,而棋盘

my coding life 1207

hdu 4121 Xiangqi 大模拟

题目链接:         判断所给期盼

飞火扑蛾的专栏 666

HDU4121 UVa1589 Xiangqi 解题报告

http://acm.hdu.edu.cn/showproblem.php?pid=4121​ 这是一道模拟的题,大致是中国象棋的规则,然后给你输入红方和黑方的棋子,然后再给出红方的其它棋子,其它棋子只能为 车、马、炮,且棋盘一共只有8个棋子。题目中的情况是,现在轮到黑方来移动棋子,来判断是否已经把黑方的将“将死”。首先读完题目,就知道这是一道模拟题。需要模拟象棋的规则,对棋盘进行操作。而且,我们

mukevinran的博客 942

HDU 4121 Xiangqi

题目链接 Problem Description Xiangqi is one of the most popular two-player board games in China. The game represents a battle between two armies with the goal of capturing the enemy’s “general” piece. I...

Running Bit. 469

HDU 4121 Xiangqi

象棋大模拟

Tc的专栏 1194

POJ4001 HDU4121 UVA1589 UVALive5829 Xiangqi紫书

一下午ac了,狂喜 一个我看了才找对思路的题解 开始思路:把棋盘的正在被将的点画上 麻烦:可能重叠将,可能吃子 现在思路:存棋盘,判断将走的四个点,到底能不能至少有一个躲过将军。先看是否对将注意。 具体见下,还有一个输出棋盘的注释,可以看到。 https://blog.youkuaiyun.com/sunlanchang/article/details/56682373 一个找到我错的测试数据,tql 是对将的那个发现 https://blog.youkuaiyun.com/weixin_30606669/article/deta

出尘的博客 157
上一篇: zoj3826 DFS
下一篇: foj2204 圆环没有连续7个黑或白的可能数
ccyy-
博客等级 码龄12年 31粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值