书上具体所有题目:http://pan.baidu.com/s/1hssH0KO
代码:(Accepted,0 ms)

//UVa 220 - Othello
#include<iostream>
char Board[11][11], Current, Command[5];
bool Flag, L_Refresh;//flag用于空格的输出,同时可以判断出本局是不是当前颜色的棋子无路可走
int Times, Num[2];//Num:0白1黑
int Rx[] = { 0, 0,1,-1,1,-1,1,-1 };
int Ry[] = { 1,-1,0, 0,1,-1,-1,1 };
inline char oppo() { return (Current == 'W' ? 'B' : 'W'); }bool judge(int i, int j, int x, int y, bool is_print) {int ii = i + 1, jj = j + 1, flg = 0;while ((i += x) < 8 && (j += y) < 8 && i >= 0 && j>=0) {if (Board[i][j] == '-') break;if (Board[i][j] == Current) {if (!flg) break;if (is_print) {if (Flag) printf(" ");printf("(%d,%d)", ii, jj);}if (!Flag) Flag = true;return true;}++flg;}return false;
}void change(int i, int j, int x, int y) {int n = 0;while (Board[i += x][j += y] != Current) {Board[i][j] = Current, ++n;}Current == 'W' ? (Num[0] += n, Num[1] -= n) : (Num[0] -= n, Num[1] += n);
}void L(bool is_print) {L_Refresh = 1, Flag = 0;for (int i = 0;i < 8;++i)  for (int j = 0;j < 8;++j) {if (Board[i][j] != '-') continue;for (int l = 0;l < 8;++l)if (judge(i, j, Rx[l], Ry[l], is_print))  break;}if (is_print) Flag ? printf("\n") : printf("No legal move.\n");
}void M() {char i = Command[1] - 49, j = Command[2] - 49;if (!L_Refresh) L(0);if (!Flag) Current = oppo();for (int l = 0;l < 8;++l)if (judge(i, j, Rx[l], Ry[l], 0)) change(i, j, Rx[l], Ry[l]);Current == 'W' ? Num[0] += 1 : Num[1] += 1;Board[i][j] = Current;Current = oppo();L_Refresh = 0;printf("Black - %2d White - %2d\n", Num[1], Num[0]);
}void Q() {for (int i = 0;i < 8;++i) printf("%s\n", Board[i]);
}int main()
{//freopen("in.txt", "r", stdin);scanf("%d", &Times);while (Times--) {for (int i = 0;i < 8;++i) scanf("%s", Board[i]);scanf("\n%c", &Current);L_Refresh = 0;Num[0] = Num[1] = 0;for (int i = 0;i < 8;++i)  for (int j = 0;j < 8;++j) {if (Board[i][j] == 'W') ++Num[0];else if (Board[i][j] == 'B') ++Num[1];}while (scanf("%s", Command) && Command[0] != 'Q')Command[0] == 'L' ? L(1) : M();Q();if (Times) printf("\n");}return 0;
}

分析:
在uDebug上调试都对了,提交时还是无限WA,挠的头发都要掉光了,最后发现忘记把freopen(“in.txt”, “r”, stdin);加注释了@。@。。。。气得我笑出声。
首先是List all possible moves for the current player.有上下左右与4条斜线8种情况。8*8个格子每个都要检索一遍。先judge()查看每个位置各个方向是否legal,如果可以放置,输出之。输出直接放在judge里了,不高兴写入字符数组了,后面M()也会用到judge,这时不希望他输出,于是给judge()加了个is_print变量来控制。尽量代码重用。还有对于这八个方向,我一开始是用的傻傻的枚举,

if (judge(i, j, 0, 1, is_print)) continue;
if (judge(i, j, 0, -1, is_print)) continue;
if (judge(i, j, 1, 0, is_print)) continue;
if (judge(i, j, -1, 0, is_print)) continue;
if (judge(i, j, 1, 1, is_print)) continue;
if (judge(i, j, -1, -1, is_print)) continue;
if (judge(i, j, 1, -1, is_print)) continue;
if (judge(i, j, -1, 1, is_print)) continue;

后来VJ上看到别人用以下数组,

int rx[] = { 0, 0,1,-1,1,-1,1,-1 }, ry[] = { 1,-1,0, 0,1,-1,-1,1 };

一开始没看懂他这奇怪的数组干嘛的,看懂后真的是令我拍大腿叫绝。
所以现在只需一个循环

for (int l = 0;l < 8;++l)if (judge(i, j, Rx[l], Ry[l], 0)) change(i, j, Rx[l], Ry[l]);

即可,真心方便。下面M()函数也一样。
还有就是L_Refresh的作用。系统有可能一口气执行多次L()(当然我不确定,只是有可能),也可能未执行就执行M,这时需要知道是不是无合法操作,还得先执行L(),L_Refresh就是用来检测L()有没有执行过,且防止其重复执行多次。
还有那个输出,比如“Black - 1 White - 4”,数字1和4在输出时应用“ %2d”输出,而不是两个空格键。之前看题目“Black - xx White - yy”的xx、yy没看懂,后来才知道是占两个格子的意思。

转载于:https://www.cnblogs.com/xienaoban/p/6798104.html

[刷题]算法竞赛入门经典(第2版) 4-3/UVa220 - Othello相关推荐

  1. [刷题]算法竞赛入门经典(第2版) 4-1/UVa1589 - Xiangqi

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1589 #include<iostream> #incl ...

  2. [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation

    题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...

  3. [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile

    题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...

  4. [刷题]算法竞赛入门经典(第2版) 5-2/UVa1594 - Ducci Sequence

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,20 ms) //UVa1594 - Ducci Sequence #include< ...

  5. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...

  6. 算法竞赛入门经典(第二版)第三章习题

    声明:作者水平有限,只是会基础C语言的小菜,C++还未入门.作者仅根据算法竞赛入门经典(第二版)书上第三章习题所述题意而编写,并未严格按照原题的输入输出编写,代码仅经过个人测试(OJ网站太慢了).代码 ...

  7. 刘汝佳《算法竞赛入门经典(第二版)》习题(三)

    刘汝佳<算法竞赛入门经典(第二版)>第三章习题(一) 习题3-1 得分(ACM/ICPC Seoul 2005,UVa1585) 给出一个由O和X组成的串(长度为1~80),统计得分.每个 ...

  8. 刘汝佳《算法竞赛入门经典(第二版)》习题(六)

    刘汝佳<算法竞赛入门经典(第二版)>第四章习题(4-1~4-3) 习题4-1 象棋(Xiangai,ACM/ICPC Fuzhou 2011,UVa1589) 考虑一个象棋残局,其中红方有 ...

  9. 刘汝佳《算法竞赛入门经典(第二版)》习题(二)

    刘汝佳<算法竞赛入门经典(第二版)>第二章习题 目录 刘汝佳<算法竞赛入门经典(第二版)>第二章习题 习题2-1 水仙花数 习题2-2 韩信点兵 习题2-3 倒三角形 习题2- ...

最新文章

  1. 计算机病毒实践汇总五:搭建虚拟网络环境
  2. IT工作者,你们的爱情是这样的吗?
  3. 计算机的好处和坏处的英语作文,《电脑的好处和坏处》英语作文 80词以上 谢谢...
  4. [转]Tomcat启动错误的几件事
  5. 自己动手利用KVM和Intel VT实现简单虚拟机
  6. LiveVideoStackCon讲师热身分享 ( 十三 ) —— Intel QSV技术在FFmpeg中的实现与使用
  7. 怎么看事务有没有开启成功_雅思复议又贵又难?看这位复议口语与写作都成功的学生怎么说...
  8. jvm 方法内联_方法内联在JVM中有多积极?
  9. 解决Ubuntu“下载额外数据文件失败 ttf-mscorefonts-installer”的问题
  10. Angular自动取消订阅RxJs
  11. scala 转换为字符串_如何在Scala中将字符串转换为布尔值?
  12. python中返回上一步操作_通过实例解析Python文件操作实现步骤
  13. mysql 单例模式_php基于单例模式封装mysql类完整实例
  14. 【时间序列预测】基于matlab LMS麦基玻璃时间序列预测【含Matlab源码 1443期】
  15. Eclipse 快捷键
  16. VNX VMX and delete luns
  17. C语言LMS双麦克风消噪算法,基于两个时域LMS算法双麦克风系统分析.doc
  18. openwrt 软件安装依赖冲突
  19. my.ini文件在哪
  20. python爬虫系列--lxml(etree/parse/xpath)的使用

热门文章

  1. SMTP 队列邮件对照表
  2. 常见的14种异常心电图的波形特点
  3. NoClassDefFoundError: com/google/protobuf/RpcCallback
  4. It's highly recommended that you fix the library with 'execstack -c libfile', or link it with '-z
  5. 只导出项目需要的pip依赖包-方法的缺陷
  6. scikit-learn工具包使用建议(转)
  7. 深度学习(三十二)——AlphaGo, AlphaStar
  8. 【数学基础】拉格朗日对偶
  9. linux文件查找工具,分享|Linux 中一种友好的 find 替代工具
  10. badboy录制乱码_Badboy 录制脚本参数化和回放