UVa1589

news/2024/12/4 17:22:07/
/*
题意很简单,就是黑方只剩下一个将,红方还有很多子,而且当前的残局是红方正在将军,判断红方是否已经将死黑方
红方只有四种棋子,帅,车,炮,马,因此按照每个棋子的运算规则,即可判断出红方已经能吃到的位置
1。给棋子编码,炮是1,马是2,车是3,因为在对将的时候帅的作用和车是一样的,因此把帅也编成3号,按照车处理
2.这中间使用两个棋盘来记录,mp是残局时每个棋子的位置,an记录判断后红方能够吃到的位置,0代表不能吃到,-1表示能吃到。
之所以设置两个棋盘是因为,不能采用覆盖写的方式,因为如果覆盖写,在计算红方能吃到的位置的时候,就可能覆盖红方棋子。
3.中间容易出现错误的地方在于边界的判断,尤其是黑将在移动位置的时候可能会吃掉红方棋子,
因此在判断红方棋子能吃到的位置的时候,要考虑到红方能够吃到的红方自己的第一个棋子,这就是边界情况
 
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<vector>
#include<utility>
#include<unordered_set>
#include<unordered_map>
#include<string.h>
using namespace std;
 
 
 
 
int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int hou[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,-2},{2,-1},{2,1},{1,2}};
int leg[8][2]={{0,-1},{-1,0},{-1,0},{0,1},{0,-1},{1,0},{1,0},{0,1}};
int mp[11][10],an[11][10];
 
 
int check(int x,int y){return x>0&&x<11&&y>0&&y<10;}
void doH(int x,int y){
    for(int i=0;i<8;++i){
        int hx=x+hou[i][0],hy=y+hou[i][1];
        int lx=x+leg[i][0],ly=y+leg[i][1];
        if(check(lx,ly)&&mp[lx][ly]==0&&check(hx,hy))an[hx][hy]=-1;
    }
}
void doR(int x,int y){
    for(int i=x-1;i>0;--i){
        if(check(i,y)){
            an[i][y]=-1;
            if(mp[i][y]!=0)break;//这句代码作用就是判断红方棋子刚好吃到红方棋子的位置
        }
    }
    for(int i=x+1;i<11;++i){
        if(check(i,y)){
            an[i][y]=-1;
            if(mp[i][y]!=0)break;
        }
    }
    for(int i=y-1;i>0;--i){
        if(check(x,i)){
            an[x][i]=-1;
            if(mp[x][i]!=0)break;
        }
    }
    for(int i=y+1;i<10;++i){
        if(check(x,i)){
            an[x][i]=-1;
            if(mp[x][i]!=0)break;
        }
    }
}
void doC(int x,int y){
    int c;
    c=x-1;while(check(c,y)&&mp[c][y]==0)--c;
    for(int i=c-1;i>0;--i){
        if(check(i,y)){
            an[i][y]=-1;
            if(mp[i][y]!=0)break;
        }
    }
    c=x+1;while(check(c,y)&&mp[c][y]==0)++c;
    for(int i=c+1;i<11;++i){
        if(check(i,y)){
            an[i][y]=-1;
            if(mp[i][y]!=0)break;
        }
    }
    c=y-1;while(check(x,c)&&mp[x][c]==0)--c;
    for(int i=c-1;i>0;--i){
        if(check(x,i)){
            an[x][i]=-1;
            if(mp[x][i]!=0)break;
        }
    }
    c=y+1;while(check(x,c)&&mp[x][c]==0)++c;
    for(int i=c+1;i<10;++i){
        if(check(x,i)){
            an[x][i]=-1;
            if(mp[x][i]!=0)break;
        }
    }
}
 
void printm(){
    printf("Now chese is\n");
    for(int i=1;i<11;++i){
        for(int j=1;j<10;++j)printf("%3d",an[i][j]);
        printf("\n");
    }
}
 
int main()
{
    int N,px,py,x,y;
    char s[5];
    while(scanf("%d%d%d",&N,&px,&py)==3&&N){
        memset(mp,0,sizeof(mp));
        memset(an,0,sizeof(an));
        for(int i=0;i<N;++i){
            scanf("%s%d%d",s,&x,&y);
            if(s[0]=='C')mp[x][y]=1;
            if(s[0]=='H')mp[x][y]=2;
            if(s[0]=='R'||s[0]=='G')mp[x][y]=3;
        }
        //printm();
        for(int x=1;x<11;++x){
            for(int y=1;y<10;++y){
                if(mp[x][y]>0){
                    if(mp[x][y]==1)doC(x,y);
                    if(mp[x][y]==2)doH(x,y);
                    if(mp[x][y]==3)doR(x,y);
                    //printm();
                }
            }
        }
        int flag=1;
        for(int i=0;i<4;++i){
            x=px+d[i][0],y=py+d[i][1];
            if(x>0&&x<4&&y>3&&y<7&&an[x][y]==0){
                flag=0;
                break;
            }
        }
        printf("%s\n",flag==1?"YES":"NO");
    }
    return 0;
}

http://www.ppmy.cn/news/521528.html

相关文章

hdu1789

/* 分析&#xff1a; 简单贪心&#xff0c;一开始没想到思路。 很直观的&#xff0c;第一步按照score从大到小排序&#xff0c;如果score 相等&#xff0c;则按照deadline从小到大排。 然后开始选择&#xff0c;让当前的课排在其deadline上面&#xff0c;如果 这一天已经被占用…

Zcmu1538

水题来一波 1538: 随机数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 789 Solved: 617 [Submit][Status][Web Board] Description 有一个rand(n)的函数&#xff0c;它的作用是产生一个在[0,n)的随机整数。现在有另外一个函数&#xff0c;它的代码如下&#xff1a; i…

联发科八核芯片MT6599 起步赢高通,辉达NVIDIA

中国手机品牌大厂中兴近期推出的四核U985智能手机销售优于预期&#xff0c;市场近期传出&#xff0c;中兴领先同业为明年推出的八核智能手机命名为“阿帕奇’&#xff0c;而联发科尚未公开推出的八核手机芯片MT6599&#xff0c;打败高通、辉达NVIDIA成为阿帕奇的核心芯片。 据了…

%u96E8%u540E%u5929%u775B%u7684%u6837%u5B50

%u96E8%u540E%u5929%u775B%u7684%u6837%u5B50%u3000 %u50CF%u6253%u5F00%u5F69%u7ED8%u7684%u6F06%u76D2%u91CC%u9762%u6709%u79CB%u51AC%u6DE1%u9752%u7684%u5929%u6C14%u3000 转载于:https://blog.51cto.com/29017/3869

关于Android开发中SensorManager频率设置的问题

今天无聊&#xff0c;看了看Android手机传感器部分的编程&#xff0c;看到Android手机中的传感器在注册监听的时候&#xff0c;需要设置一个频率&#xff0c;其实这个频率可以理解为获取传感器状态和值的频率&#xff0c;我之前以为在Android手机中这个频率是固定的&#xff0c…

字符设备驱动内部实现原理解析及分步注册流程和代码实例

一、字符设备驱动内部实现原理 用户层调用open函数时&#xff0c;内核层的sys_open()会根据用户层传递的文件路径参数找到该文件的文件信息结构体struct inode{}&#xff0c;这个文件信息结构体存放的是该文件的相关信息&#xff0c;里面有一个成员是字符设备驱动结构体struct…

Android屏幕适配经验谈

先来解释一些相关的名词&#xff1a; 屏幕尺寸&#xff1a; 也就是我们平时所说的某某手机是几寸屏&#xff0c; 比如HTC one V这款手机是3.7寸的&#xff0c; 这里的寸说的是英寸&#xff08;inch&#xff09;&#xff0c;国际上习惯使用的单位&#xff0c;1inch 2.54cm&am…