书上具体所有题目: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没看懂,后来才知道是占两个格子的意思。

[刷题]算法竞赛入门经典(第2版) 4-3/UVa220 - Othello的更多相关文章

  1. [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...

  2. [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci

    题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...

  3. [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A

    题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...

  4. [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa1590 - IP Networks #include<iost ...

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

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

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

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

  7. [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536

    这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...

  8. [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities

    题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...

  9. [刷题]算法竞赛入门经典(第2版) 5-11/UVa12504 - Updating a Dictionary

    题意:对比新老字典的区别:内容多了.少了还是修改了. 代码:(Accepted,0.000s) //UVa12504 - Updating a Dictionary //#define _XieNao ...

  10. [刷题]算法竞赛入门经典(第2版) 5-10/UVa1597 - Searching the Web

    题意:不难理解,照搬题意的解法. 代码:(Accepted,0.190s) //UVa1597 - Searching the Web //#define _XIENAOBAN_ #include&l ...

随机推荐

  1. iOS最好用的引导页

    最近项目结束的时候又要改引导页,之前写的启动页改起来太麻烦了,所以就直接封装一个,功能可能还不是很完善,但是感觉用起来也比较方便,在这里和大家分享一下. 这是github的下载地址:https://g ...

  2. Ubuntu16.04安装xampp及部署Testlink

    一.从官网下载xampp并安装: https://www.apachefriends.org/zh_cn/index.html chmod +x xampp-linux-x64-5.6.30-0-in ...

  3. Python之路-shell&计划任务

    开发脚本自动部署及监控1.编写脚本自动部署反向代理.web.nfs:要求: I.部署nginx反向代理三个web服务,调度算法使用加权轮询:           II.所有web服务使用共享存储nfs ...

  4. Excel图表-太极图

    p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...

  5. span表情输入框 --- Author: rose && lvyerose@163.com

        像QQ等社交聊天中,不可或缺的一部分就是我们常用的表情输入了,有时候有趣的表情同样能吸引住用户达到用户常驻的效果,当然,我们开发的时候不用去研究如何才能做到有趣,如何才能做到足够吸引用户,我们 ...

  6. Java开发—乘风破浪

    最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜.手头的基本完成了,因此打算好好来熟悉下java的相关工具库,需要借助你们,好好的在JAV ...

  7. C#遍历指定文件夹中的所有文件(转)

    原文链接:http://www.cnblogs.com/qianqianfy/archive/2009/07/08/1518974.html 1. C#遍历指定文件夹中的所有文件 DirectoryI ...

  8. layout_weight相关知识

    之前使用layout_weight都是在layout_width或layout_height为0dp的时候,都没出现什么问题,但是无意间看到了如果设为match_parent会出现不同效果记录一下. ...

  9. 简单分析下用yii2的yii\helpers\Html类和yii.js实现的post请求

    yii2提供了很多帮助类,比如Html.Url.Json等,可以很方便的实现一些功能,下面简单说下这个Html.用yii2写view时时经常会用到它,今天在改写一个页面时又用到了它.它比较好用的地方就 ...

  10. 通过UDP广播实现Android局域网Peer Discovering

    本文是对个人笔记中内容的整理,部分代码及图片来自互联网,由于不好找到原始出处,所以未加注明. 如有痛感,联系删除. 本文将介绍以下知识点: TCP与UDP的区别: 单播.多播.广播: Java中实现U ...