PC/UVa:110107/10196

Check the Check

这道题其实不难,但是有几个点需要注意:

  • 各种边界条件特别容易出错
  • 车、 象、后的前进路线上不能有其它棋子挡着
  • 其实不用判断王将军王的情况,因为如果有一个王将军了另一个王,那么必定出现两个王互相将军的情况
#include <iostream>using namespace std;char board[8][8] = { 0 };bool checkp(int i, int j)
{if (i + 1 < 8 && j - 1 >= 0 && board[i + 1][j - 1] == 'K')return true;if (i + 1 < 8 && j + 1 < 8 && board[i + 1][j + 1] == 'K')return true;return false;
}bool checkP(int i, int j)
{if (i - 1 >= 0 && j - 1 >= 0 && board[i - 1][j - 1] == 'k')return true;if (i - 1 >= 0 && j + 1 < 8 && board[i - 1][j + 1] == 'k')return true;return false;
}bool checkrR(int i, int j, char king)
{//upfor (int k = i - 1; k >= 0; k--){if (board[k][j] == king) return true;else if (board[k][j] == '.') continue;else break;}//rightfor (int k = j + 1; k < 8; k++){if (board[i][k] == king) return true;else if (board[i][k] == '.') continue;else break;}//downfor (int k = i + 1; k < 8; k++){if (board[k][j] == king) return true;else if (board[k][j] == '.') continue;else break;}//leftfor (int k = j - 1; k >= 0; k--){if (board[i][k] == king) return true;else if (board[i][k] == '.') continue;else break;}return false;
}bool checkbB(int i, int j, char king)
{//up leftfor (int k = 1; i - k >= 0 && j - k >= 0; k++){if (board[i - k][j - k] == king) return true;else if (board[i - k][j - k] == '.') continue;else break;}//up rightfor (int k = 1; i - k >= 0 && j + k < 8; k++){if (board[i - k][j + k] == king) return true;else if (board[i - k][j + k] == '.') continue;else break;}//down leftfor (int k = 1; i + k < 8 && j - k >= 0; k++){if (board[i + k][j - k] == king) return true;else if (board[i + k][j - k] == '.') continue;else break;}//down rightfor (int k = 1; i + k < 8 && j + k < 8; k++){if (board[i + k][j + k] == king) return true;else if (board[i + k][j + k] == '.') continue;else break;}return false;
}bool checkqQ(int i, int j, char king)
{bool b = checkrR(i, j, king);if (b) return b;else return checkbB(i, j, king);
}bool checkkK(int i, int j, char king)
{if (i - 1 >= 0 && j - 1 >= 0 && board[i - 1][j - 1] == king) return true;else if (i - 1 >= 0 && board[i - 1][j] == king) return true;else if (i - 1 >= 0 && j + 1 < 8 && board[i - 1][j + 1] == king) return true;else if (j + 1 < 8 && board[i][j + 1] == king) return true;else if (i + 1 < 8 && j + 1 < 8 && board[i + 1][j + 1] == king) return true;else if (i + 1 < 8 && board[i + 1][j] == king) return true;else if (i + 1 < 8 && j - 1 >= 0 && board[i + 1][j - 1] == king) return true;else if (j - 1 >= 0 && board[i][j - 1] == king) return true;else return false;
}bool checknN(int i, int j, char king)
{if (i - 1 >= 0 && j - 2 >= 0 && board[i - 1][j - 2] == king) return true;else if (i - 2 >= 0 && j - 1 >= 0 && board[i - 2][j - 1] == king) return true;else if (i - 2 >= 0 && j + 1 < 8 && board[i - 2][j + 1] == king) return true;else if (i - 1 >= 0 && j + 2 < 8 && board[i - 1][j + 2] == king) return true;else if (i + 1 < 8 && j + 2 < 8 && board[i + 1][j + 2] == king) return true;else if (i + 2 < 8 && j + 1 < 8 && board[i + 2][j + 1] == king) return true;else if (i + 2 < 8 && j - 1 >= 0 && board[i + 2][j - 1] == king) return true;else if (i + 1 < 8 && j - 2 >= 0 && board[i + 1][j - 2] == king) return true;else return false;
}bool check(int cnt)
{bool bLast = true, bBlack = false, bWhite = false;for (int i = 0; i < 8; i++){for (int j = 0; j < 8; j++){cin >> board[i][j];if (board[i][j] != '.') bLast = false;}}if (bLast) return bLast;cout << "Game #" << cnt << ": ";for (int i = 0; i < 8; i++){for (int j = 0; j < 8; j++){switch (board[i][j]){case 'p':bWhite = checkp(i, j);break;case 'P':bBlack = checkP(i, j);break;case 'r':bWhite = checkrR(i, j, 'K');break;case 'R':bBlack = checkrR(i, j, 'k');break;case 'b':bWhite = checkbB(i, j, 'K');break;case 'B':bBlack = checkbB(i, j, 'k');break;case 'q':bWhite = checkqQ(i, j, 'K');break;case 'Q':bBlack = checkqQ(i, j, 'k');break;case 'k':bWhite = checkkK(i, j, 'K');break;case 'K':bBlack = checkkK(i, j, 'k');break;case 'n':bWhite = checknN(i, j, 'K');break;case 'N':bBlack = checknN(i, j, 'k');break;default:break;}if (bWhite || bBlack){if (bWhite) cout << "white king is in check." << endl;else if (bBlack) cout << "black king is in check." << endl;return false;}}}cout << "no king is in check." << endl;return false;
}int main()
{bool bLast = false;int cnt = 1;while (!bLast){bLast = check(cnt++);}return 0;
}
/*
..k.....
ppp.pppp
........
.R...B..
........
........
PPPPPPPP
K.......rnbqkbnr
pppppppp
........
........
........
........
PPPPPPPP
RNBQKBNRrnbqk.nr
ppp..ppp
....p...
...p....
.bPP....
.....N..
PP..PPPP
RNBQKB.R........
........
........
........
........
........
........
........
*/

Programming Challenges 习题 1.6.7相关推荐

  1. Dynamic Languages — ready for the next challenges, by design

    Dynamic Languages - ready for the next challenges, by design. David Ascher, PhD, ActiveState1 July 2 ...

  2. 杭电acm第2304题答案c语言,【转】杭电ACM试题分类

    注:网上搜的 第一篇 1001 这个就不用说了吧 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 ...

  3. 华为技术面试编码题_最佳技术编码面试准备书

    华为技术面试编码题 Technical coding interviews are notoriously difficult - almost borderline quiz-like for th ...

  4. 倦怠和枯燥_如何不断学习(不倦怠)

    倦怠和枯燥 In tech, constantly learning (both in and out of work) is an unstated job requirement. 在科技界,不断 ...

  5. java面试编程面试题_完美的编程面试问题

    java面试编程面试题 by Sachin Malhotra 由Sachin Malhotra 完美的编程面试问题 (The Perfect Programming Interview Problem ...

  6. 对开发者有用的英文网站合集,建议收藏!

    ​​问答社区 Stack Overflow : subscribe to their weekly newsletter and any other topic which you find inte ...

  7. Online Judge for ACM-ICPC etc.

    Virtual JudgeACM-ICPC Live Archive - HomeUVa Online Judge - HomeWelcome To PKU JudgeOnline(POJ)Welco ...

  8. 开发者必备英文网站合集

    这是一份对开发者有用的英文网站清单,涉及到从初学者到行业大牛成长的方方面面,还有很多事英语学习的网站,请相信我,这些肯定会对你有所帮助的. CareerBuilder.GitHub.Google.Ha ...

  9. 教孩子学编程python豆瓣_教孩子学编程 Python

    教孩子学习Python目录第1章Python编程基础知识:了解环境111知道Python 312编写的Python程序513运行Python程序514章总结615编程挑战7章2只乌龟图:图纸与Pyth ...

最新文章

  1. 第十章 springboot + logback
  2. double,float,BigDecimal类型数值的操作
  3. UA MATH524 复变函数9 柯西公式与幂级数展开
  4. 低效能人士的七个习惯
  5. 我校四名学生在全国中学生物理竞赛中勇夺一金三银并全部直保清华
  6. 全网最细笔记java与kotlin的一些异同
  7. Quartz.NET
  8. c语言程序设计课件数组,数组(C语言程序设计)课件
  9. css高度自动填满_Unity--自动版面(Grid Layout Group)
  10. 在res/values下创建attrs.xml
  11. 机器人剥人皮眼看自己是机器人_高中生自己编程机器人,获世界大赛“全能奖”...
  12. http协议中的响应代码从 1xx ~ 5xx,一共有41种
  13. python如何提高性能_python – 如何在这个短代码中提高numpy性能...
  14. 基于FPGA的简易DDS信号发生器的设计与验证
  15. 关于SpringMVC中model的attribute无法指定别名的解决方案
  16. ElasticSearch全文搜索引擎之term和match的区别
  17. 升级版4850竖曲线
  18. JVM垃圾回收机制(一)
  19. 建行u盾弹不出来_建行网银不自动跳出网页 建行u盾不能弹出快捷登录
  20. vtk-m的安装与配置

热门文章

  1. Android侧滑返回分析和实现(不高仿微信),flutter项目实战
  2. Python+Vue计算机毕业设计教师教学质量评价管理2lbw7(程序+LW+源码+部署)
  3. 通信中的MGF(矩生成函数)
  4. 【 Android 10 系统启动 】系列 -- ShutdownThread(关机流程)
  5. 深度揭秘聚合支付的盈利模式
  6. 从头开始学习->JVM(三):类加载器(上)
  7. 新时代 新创意 新场景 新消费 2021“设计+”珠宝首饰创新设计展将于10月17日开幕
  8. 计算机组装与维护论文 致谢,计算机组装与维护论文
  9. python爬取58同城租房信息_分页爬取58同城租房信息.py
  10. 每次开机都要按F1的解决办法