题目链接

GYM101744D

题解

题意

给出一个棋盘,上面分布着许多棋子,判断能否用自己的任意一个棋子在一步之内吃到指定的对面的棋子。

思路

模拟!
还是有很多可以回味的地方滴。

  1. 输入方面

    1. 可以看出棋盘的[0, 0]位置是在左下角的,为了方便处理我们可以倒着存图;
  2. 读题细节方面
    1. 注意p只能走一步而不是整个对角线;
    2. 骑士的八个方位是不会受到除了出界之外的阻挡的;
    3. 国王可以走八个方位。

代码逻辑:
存储小写字母和大写字母的位置。小写字母会被小写字母阻挡且不能到达该小写字母的位置,也会被碰到的第一个大写字母阻挡但是可以吃掉这个大写字母。通过这个判断每个小写字母所能到达的所有点。之后判断这个集合中是否包含题目给出的点即可。

AC代码

#include <bits/stdc++.h>using namespace std;int const N = 10;
typedef pair<int, int> P;
char ch[N][N];
set<P> big, reach, lit;bool grid(int x, int y) {return (x >= 0 && x < 8 && y >= 0 && y < 8) && ((lit.find(P(x, y)) == lit.end()));
}void JudgeP(int x, int y) {int xx = 1, yy = -1;int X = x, Y = y;x += xx, y += yy;if (grid(x, y)) {reach.insert(P(x, y));}x = X, y = Y;xx = 1, yy = 1;x += xx, y += yy;if (grid(x, y)) {reach.insert(P(x, y));}
}int f[8][2] = {{1,  -2},{1,  2},{-1, -2},{-1, 2},{2,  1},{2,  -1},{-2, 1},{-2, -1},
};void JudgeC(int x, int y) {for (auto &i : f) {int xx = x + i[0], yy = y + i[1];if (grid(xx, yy)) {reach.insert(P(xx, yy));}}
}void JudgeT(int x, int y) {int xo = x, yo = y;x -= 1;while (grid(x, y)) {reach.insert(P(x, y));if ((big.find(P(x, y)) != big.end())) {break;}x -= 1;}x = xo, y = yo;y -= 1;while (grid(x, y)) {reach.insert(P(x, y));if ((big.find(P(x, y)) != big.end())) {break;}y -= 1;}x = xo, y = yo;x += 1;while (grid(x, y)) {reach.insert(P(x, y));if ((big.find(P(x, y)) != big.end())) {break;}x += 1;}x = xo, y = yo;y += 1;while (grid(x, y)) {reach.insert(P(x, y));if ((big.find(P(x, y)) != big.end())) {break;}y += 1;}
}void JudgeB(int x, int y) {int xx = 1, yy = -1;int xo = x, yo = y;x += xx, y += yy;while (grid(x, y)) {reach.insert(P(x, y));if ((big.find(P(x, y)) != big.end())) {break;}x += xx, y += yy;}xx = -1, yy = 1;x = xo, y = yo;x += xx, y += yy;while (grid(x, y)) {reach.insert(P(x, y));if ((big.find(P(x, y)) != big.end())) {break;}x += xx, y += yy;}xx = -1, yy = -1;x = xo, y = yo;x += xx, y += yy;while (grid(x, y)) {reach.insert(P(x, y));if ((big.find(P(x, y)) != big.end())) {break;}x += xx, y += yy;}xx = 1, yy = 1;x = xo, y = yo;x += xx, y += yy;while (grid(x, y)) {reach.insert(P(x, y));if ((big.find(P(x, y)) != big.end())) {break;}x += xx, y += yy;}
}void JudgeR(int x, int y) {JudgeB(x, y);JudgeT(x, y);
}int ff[8][2] = {{1,  0},{0,  1},{0,  -1},{-1, 0},{-1, -1},{-1, 1},{1,  -1},{1,  1},
};void JudgeK(int x, int y) {for (auto &i : ff) {int xx = x + i[0], yy = y + i[1];if (grid(xx, yy)) {reach.insert(P(xx, yy));}}
}int main() {for (int i = 7; i >= 0; i--) {scanf("%s", ch[i]);for (int j = 0; j < 8; j++) {if (ch[i][j] >= 'a' && ch[i][j] <= 'z') lit.insert(P(i, j));else if (ch[i][j] != '.') {big.insert(P(i, j));}}}for (int i = 7; i >= 0; i--) {for (int j = 0; j < 8; j++) {char chr = ch[i][j];switch (chr) {case 'p':reach.insert(P(i, j));JudgeP(i, j);break;case 'c':JudgeC(i, j);reach.insert(P(i, j));break;case 't':JudgeT(i, j);reach.insert(P(i, j));break;case 'b':JudgeB(i, j);reach.insert(P(i, j));break;case 'r':JudgeR(i, j);reach.insert(P(i, j));break;case 'k':JudgeK(i, j);reach.insert(P(i, j));break;default:break;}}}char tmp[10];scanf("%s", tmp);int Y = tmp[0] - 'a', X = tmp[1] - '0' - 1;if (reach.find(P(X, Y)) != reach.end()) {cout << "Sim" << '\n';} else cout << "Nao" << '\n';return 0;
}

后记

又到了记录憨批时刻的时刻了。

读题读题读题读题!!!!
这个题是真滴让我又一次认识到了读题的重要性啊QAQ
第一次WA:这个时候代码已经大概成形,判断了一下发现棋盘的存储反了QAQ
第二次WA:误以为大小写都可以走
第三次WA:把大写字母和小写字母的处理逻辑混淆成一种,即到不了大写字母的位置。。
第四次WA:在不应该break的地方break了
第五次WA:国王可以走八个方向
第六次WA:卒一次只能走一步,我以为是一整个对角线
大概。。。就这些。。。
本来以为这题给我二十分钟还来得及,结果就很难受QAQ

GYM MaratonIME plays Chess 模拟相关推荐

  1. Boboniu Plays Chess (模拟构造)

    Boboniu Plays Chess 题目链接 题意 : 一个n*m大的棋盘,在某个位置有一个棋子,棋子的走法和象棋中的"车"一样,要求输出棋子遍历完整个棋盘所有位置经过的位置. ...

  2. MaratonIME plays Cîrokime

    MaratonIME plays Cîrokime Have you ever seen flavored vodka? Everaldo, Glauber The MaratonIME member ...

  3. Gym - 101972A Multiplication Dilemma(模拟)

    题目链接:点击查看 题目大意:我们规定特殊数字是除了最高位之外其他位置全是0的数,现在给出一个乘法表达式,请将这个式子拆分为只由特殊数字组成的乘法式子 题目分析:简单模拟题,我们需要先知道该怎么模拟才 ...

  4. D. Anton and Chess 模拟题 + 读题

    http://codeforces.com/contest/734/problem/D 一开始的时候看不懂题目,以为象是中国象棋那样走,然后看不懂样例. 原来是走对角线的,长知识了. 所以我们就知道, ...

  5. cf#644 div2 B. Boboniu Plays Chess

    惯例,粘个生草翻译 这题比第一题还简单(简单多了 ) 虽然题面不短,但仔细读就会发现条件不多 刚开始我误以为是一笔画的题,但题中的棋子不同,他是車 ,棋子可以直接跳过一个点,也就是上下左右随便走,那就 ...

  6. Boboniu Plays Chess

    题意:一个n*m大的棋盘,在某个位置有一个棋子,棋子的走法和象棋中的"车"一样,要求输出棋子遍历完整个棋盘所有位置经过的位置. 水题没啥说的,如果所在行没遍历完,则遍历该行,否则寻 ...

  7. codeforces B. Boboniu Plays Chess

    题目 题目: 我们有一个起始点,现在你要从这个点出发,然后访问所有的点并且只能访问一次,每一次走可以像车一样,到达一行或一列的任何一个点(经过不算到达),现在你需要打印出路径. 思路: 因为可以随意到 ...

  8. B. Boboniu Plays Chess(手速)

      有一个车(象棋中的),他可以飞跃一条直线 给出一个方格 n*m,以及起点 x,y 走过的方格是不能再走的,每个方格都要走一遍,输出路径 const int N=350+5;int n,m,t;in ...

  9. CodeForces #379(734A|734B|734C|734D|734E|734F)|二分查找|模拟|树的半径|位运算

    734A: Anton and Danik 题目大意 给定字符串中,D多输出Danik,A多输出Anton,一样多输出Friendship 题解 #include <cstdio> cha ...

最新文章

  1. C语言的链表—完整代码
  2. 配置所需要的依赖_Maven依赖管理之依赖传递
  3. SVG.js 基础图形绘制整理(二)
  4. Java代码简化之lombok
  5. 全面认识UML类图元素
  6. asp.net mvc3 网站退出系统后使用浏览器的回退按钮依然能返回到内容页的处理方法...
  7. 转: SMTP 服务器无法识别在 Mac 2011 Outlook 中发送电子邮件时错误。错误 17092...
  8. 关于struts2漏洞问题及解决办法
  9. 2018中国移动校招笔试记录
  10. 【技巧】谷歌Chrome浏览器清理缓存的两种方式
  11. BOM 定时器+回调函数
  12. 原来创业也可以这样:80后乞丐网上卖烧烤 500元起家赚了400万
  13. [渝粤教育] 中国地质大学 地球科学概论 复习题
  14. 来到广西的十年之吃喝
  15. 几种颜色空间(RGB,YUV,YIQ,HSI)的基本概念及转换
  16. 解决Ubuntu下博通网卡驱动问题
  17. Android 音视频开发-FFmpeg 命令
  18. 你创业为什么会失败?
  19. 笔记本电脑应用商店服务器错误,Windows10系统无法打开这个应用商店解决方法
  20. 解决Windows开机后无启动项的问题

热门文章

  1. docker onlyoffice7.1.1 word excel ppt在线编辑、在线预览_添加中文字体和中文字号_02
  2. 目标检测: 一文读懂 CenterNet (CVPR 2019)
  3. moment 计算日期差
  4. 日志打印、main函数中代码执行顺序
  5. 2021-11-25 统计学-基于R(第四版)第八章课后习题记录及总结
  6. Huffman文件压缩之文件夹压缩
  7. 如何正确安装独立显卡?图文详解教会你安装独立显卡
  8. 亚马逊云服务AWS Marketplace “重塑”企业软件SaaS之旅
  9. sql 查询每科的前三名
  10. Flink流式计算从入门到实战 三