UVa1589 - Xiangqi

题目

UVa1589

题解

这是我做的第一题非水题,可以明显感觉到水题与非水题之间的差别...
题目是以象棋为背景的,问题就是比较典型(?)的棋盘上的问题。
拿到题第一步是处理输入,照常做就好,毕竟做水题的时候对各种状况都有了尝试。不过需要注意的一点是,这里读入棋子 'C', 'R' 等时如果采用 getchar + %c 很可能过不了(即使测试的时候能过),笔者就是在这里n多次WA了,最后换成 %s 才终于AC

接下来是对数据的处理。

我一开始想到的也是把红棋所能到的地方都作标记来处理。不过后来想这好像有点麻烦,因为这种做法应该(我没具体尝试)只能在把全部红棋读入后,再遍历一次才能开始判断。而且遍历的过程貌似也不算简单,起码代码量繁多。再之这样做就会需要结构体的辅助,按顺序紫书只是到函数了而已。

所以我想了另一种方法:每次数据读入都立刻把棋子储存到棋盘里,在全部都读完了再开始对黑将的可走路径进行是否被击杀的判断。最终我对比其他作者的代码,代码量都是要少了不小的(一般都用了一百起步甚至两百行代码,笔者只有90行不到)。

在判断的时候由于同一条轴(比如x轴)是要分两个方向(正方)遍历的。这里就有一个小技巧,写第一层的for用于操控方向(-1或者1),然后第二层则只需令j += i即可按方向遍历整个轴,同时代码量减少,不必写过多重复的代码(这会令我烦躁)。

代码

#include <stdio.h>
#include <string.h>

char Map[12][11];
void solve(int x, int y);
int G(int x, int y);  //判断会不会被红帅击杀
int H(int x, int y);  //判断会不会被红马击杀
int RL(int x, int y);  //判断会不会被红炮、车、帅击杀

int main() {
#ifdef TEST
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    
    int n, bx, by, rx, ry; char ch[3];

    while (scanf("%d%d%d", &n, &bx, &by) && by) {
        for (int i = 0; i < 11; i++) memset(Map[i], '0', sizeof(Map[i]));
        for (int i = 0; i < n; i++) 
            scanf("%s%d%d", ch, &rx, &ry), Map[rx][ry] = ch[0];
    
        solve(bx, by);
    }

    return 0;
}

void solve(int x, int y) {
    int flag = 1;
    //直接飞将获得胜利
    if (G(x, y)) { printf("NO\n"); return; }  
    //i控制方向,判断黑将四个方位中可走的路径是否被击杀
    for (int i = -1; i <= 1; i += 2) {
        if (x + i >= 1 && x + i <= 3){
            if (!RL(x + i, y) && !H(x + i, y)) 
                flag = 0;
        }
        if (y + i <= 6 && y + i >= 4) {
            if (!RL(x, y + i) && !H(x, y + i))
                flag = 0;
        }
    }
    if (flag) printf("YES\n");
    else printf("NO\n");
}

int RL(int x, int y) {
    int flag = 0;
    //i控制方向,j遍历,考虑路上所有情况共5种
    for (int i = -1; i <= 1; i += 2, flag = 0) for (int j = x + i; j <= 10 && j >= 1; j += i) {
        if (Map[j][y] == '0') continue;
        else if (flag) {
            if (Map[j][y] == 'C') return 1;
            else break;
        }
        else if (Map[j][y] == 'H' || Map[j][y] == 'C') flag = 1;
        else return 1;
    }
    for (int i = -1; i <= 1; i += 2, flag = 0) for (int j = y + i; j <= 9 && j >= 1; j += i) {
        if (Map[x][j] == '0') continue;
        else if (flag) {
            if (Map[x][j] == 'C') return 1;
            else break;
        }
        else if (Map[x][j] == 'H' || Map[x][j] == 'C') flag = 1;
        else return 1;
    }
    return 0;
}

int H(int x, int y) {
    for (int i = -1; i <= 1; i += 2) for (int j = -1; j <= 1; j += 2)
        if (x + i && Map[x + i][y + j] == '0') {
            if (Map[x + i][y + 2 * j] == 'H')
                return 1;
            else if (x + 2 * i && Map[x + 2 * i][y + j] == 'H')
                return 1;
        }
    return 0;
}

int G(int x, int y){
    for (int i = x + 1; i <= 10; i++)
        if (Map[i][y] == '0') continue;
        else if (Map[i][y] == 'G') return 1;
        else return 0;
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容

  • 快速小测试:如何重写下面的语句?要求不使用条件判断语句交换两个常量的值。 if (x == a) x= b; el...
    Colay阅读 841评论 0 0
  • 象棋文化中的科学意蕴 作为中华民族优秀文化遗产的象棋,自古即为广大民众喜闻乐见,在训练人的思维方式上起到了潜移默化...
    三毛毛子阅读 460评论 0 0
  • 1924年4月27日下午,时钟即将敲响2:00,在纽约市阿拉玛克酒店的一间大房里,俄罗斯国际象棋特级大师亚历山大·...
    速兔阅读 802评论 0 0
  • 地点:四川成都温度:9摄氏度~18摄氏度 成都游学第五天,我们的目的地有:四川大学、四川大学博物馆、杜甫草...
    Sandm浅笑阅读 287评论 0 1
  • 我会喜欢多久 我会忘记多久 我会想起多久 我觉得世事凉薄 我觉得情比纸薄 我觉得没有人爱我 转过头 原来我不爱任何人
    花花生xue阅读 334评论 3 5