黑白棋问题
原英文题意.

题意翻译

你的任务是模拟黑白棋游戏的进程。黑白棋的规则为:黑白双方轮流放棋子,每次必 须让新放的棋子“夹住”至少一枚对方棋子,然后把所有被新放棋子“夹住”的对方棋子 替换成己方棋子。一段连续(横、竖或者斜向)的同色棋子被“夹住”的条件是两端都是 对方棋子(不能是空位)。如图所示,白棋有6个合法操作,分别为(2,3),(3,3),(3,5),(6,2),(7,3),(7,4)。选择在(7,3)放白棋后变成如图所示效果(注意有竖向和斜向的共两枚黑棋变白)。注意(4,6)的黑色棋子虽然被夹住,但不是被新放的棋子夹住,因此不变白。

输入一个8*8的棋盘以及当前下一次操作的游戏者,处理3种指令:

L指令打印所有合法操作,从左到右的顺序排列(无合法操作时输出No legal move)。

Mrc指令放一枚棋子在(r,c)。如果当前游戏者没有合法操作,则是先切换游戏者再操作。保证输入合法。输出操作后的黑白棋子总数。

Q指令退出游戏,并打印当前棋盘(同输入格式)。

需要注意的问题点:

1、注意题意中不存在合法下棋位置时的操作
2、对与合法位置的判断,尽量保持原意,判断坐标是否在范围内
3、对合法下棋位置的判断:对棋盘上每个可下点,对其8个方向进行扩展判断,判断时带上方向作为参数,这样方便之后进行吃棋时对该方向上的棋进行吃操作
4、获取输入时,如果有多类型输入(单纯字母和字母加数字,可以用数组存储)

具体思路见下面的代码:

#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
using namespace std;typedef pair<int, int> P;char s[10][10];//棋盘
char c;
int d[8][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1},{1, 1}, {1, -1}, {-1, 1}, {-1, -1}}; //可以延伸的八个方向bool legal(int x, int y)//判断棋子位置是否合法
{return 1 <= x && x <= 8 && 1 <= y && y <= 8;
}char next()//每次行动后更换玩家
{return c == 'W' ? 'B' : 'W';
}bool check_dir(int x, int y, int i) //判断在(x,y)位置处向i方向是否合法
{if (s[x][y] != '-') return false;int nx = x + d[i][0];int ny = y + d[i][1];//延伸if (s[nx][ny] != next())return false;while (true)//不断沿此方向判断是否为敌棋颜色{nx += d[i][0];ny += d[i][1];if (s[nx][ny] == c) return true;if (s[nx][ny] != next())return false;}
}
bool can_set(int x, int y)//判断(x,y)能否置子
{for (int i = 0; i < 8; i ++) {if (check_dir(x, y, i)) {return true;}}return false;
}void set(int x, int y)//下子并从八个方向吃敌棋
{for (int i = 0; i < 8; i ++) {if (check_dir(x, y, i)) {int nx = x+d[i][0], ny = y+d[i][1];while (s[nx][ny] == next()) {//不断吃棋,直到遇到非敌棋s[nx][ny] = c;nx += d[i][0];ny += d[i][1];}}}s[x][y] = c;
}P cnt()//数场上的黑白棋数量
{P res(0, 0);for (int i = 1; i <= 8; i ++) {for (int j = 1; j <= 8; j ++) {if (s[i][j] == 'B') res.first ++;if (s[i][j] == 'W') res.second ++;}}return res;
}void print_chess()
{for (int i = 1; i <= 8; i ++) {for (int j = 1; j <= 8; j ++) {printf("%c", s[i][j]);}printf("\n");}
}int main(void)
{int kase;char op[4];cin >> kase;for (int t = 1; t <= kase; t++){memset(s,'n',sizeof(s));for (int i = 1; i <= 8; i ++)scanf("%s", s[i]+1);scanf("%s", op);c = op[0];if (t > 1) printf("\n");while (scanf("%s", op)){if (op[0] == 'L')//三种输入,按要求模拟{bool flag = false;bool first = true;for (int i = 1; i <= 8; i ++) {for (int j = 1; j <= 8; j ++) {if (can_set(i, j)) {flag = true;if (!first) printf(" ");printf("(%d,%d)", i, j);first = false;}}}if (flag == false) printf("No legal move.");printf("\n");}else if(op[0] == 'M'){int x = op[1]-'0', y = op[2]-'0';if (can_set(x, y)) { set(x, y);}else { c = next(); set(x, y); }c = next();P num = cnt();printf("Black - %2d White - %2d\n", num.first, num.second);} else {print_chess();break;}}}return 0;
}

UVa220黑白棋问题相关推荐

  1. UVA220 黑白棋 Othello

    题目 你的任务是模拟黑白棋游戏的进程.黑白棋的规则为:黑白双方轮流放棋子,每次必 须让新放的棋子"夹住"至少一枚对方棋子,然后把所有被新放棋子"夹住"的对方棋子 ...

  2. UVA220黑白棋题目详解

    题目直通车 UVA220 题目大意 黑白翻转棋游戏,棋子落子的位置必须是能和同色棋包住异色棋的位置,放好后被包住的异色棋要进行翻转,翻转成同色棋.需要对三种指令进行处理. L:打印所有合法操作,按照从 ...

  3. ACM篇:UVA220黑白棋总结

    很纯粹的模拟. 需要注意的是输出格式,比如最后一个(i,j)后没有空格,最后一场棋后也无回车,以及输出棋子数量时数字占两位. 简单思路. LIST:遍历棋盘,每个点单独判断八个方向是否有同色棋子,有即 ...

  4. 习题4-3 UVA220黑白棋(WA)

    2019-8-25 这道题一直在WA,没有通过,先占个坑,日后再改. 附WA代码: #include<iostream> #include<cstdio> #include&l ...

  5. 《算法竞赛入门经典》习题4-3 黑白棋(Othello, ACM、ICPC World Finals 1992, UVa220)

    原题及翻译 Othello is a game played by two people on an 8 x 8 board, using disks that are white on one si ...

  6. 51nod 1368:黑白棋 二分图最大匹配

    1368 黑白棋 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  取消关注 有一个N*M的棋盘(1<=N,M< ...

  7. android 双人黑白棋开发博客,黑白棋 - 软件资讯 - 课堂党年级博客

    黑白棋叫反棋(Reversi).奥赛罗棋(Othello)苹棋翻转棋黑白棋西本流行游戏通相互翻转棋棋盘谁棋判断胜负 黑白棋棋盘8*8格棋盘棋棋空格间像围棋交叉点始棋盘两白两黑四棋交叉放置黑棋总先 自颜 ...

  8. 从0开始 Java实习 黑白棋

    黑白棋的设计 代码如下: import java.util.*; public class Chess{char[][] chess = new char[16][16];public static ...

  9. MFC随机博弈黑白棋

    随机博弈黑白棋 随机博弈黑白棋 TxyITxs | 随机博弈黑白棋 | 2019.04.21 摘要 通过随机落子,实现黑白棋的博弈.无任何落子规则,棋子死活与围棋中棋子的死活一致,即存在至少一口气.动 ...

最新文章

  1. js中cookic的存取
  2. 面向对象的几大设计原则
  3. 特斯拉对手再秀“肌肉”,Lucid Motors展示电动汽车雪上漂移
  4. 视频图像传输学习笔记-基础小知识(一)
  5. 33个常见问题!超全Windows排查手册
  6. postgresql集群方案hot standby初级测试(二) ——处理数据能力
  7. Java基础入门笔记-单根继承
  8. Centos7默认自带了Python2.7版本,但是因为项目需要使用Python3.x,这里提供一种比较快捷方便的安装方式...
  9. 来自intlsy‘s省选debug方法
  10. RPC(远程过程调用)原理及应用
  11. 服务器dump文件位置,dump解析入门-用VS解析dump文件进行排障
  12. 终端天线—9.4G手机调试
  13. 用域代码任何带圈字符都能做出来
  14. 知识图谱的相关技术-概览(笔记)
  15. Java技术进阶推荐书单
  16. 每日一面 - mysql中,我存十亿个手机号码,考虑存储空间和查询效率,怎么设计?
  17. Unity中一些小技巧
  18. Bean Definition 生成过程详解
  19. 全球各国人口密度(1961-2018年)
  20. 成就你一生的100个哲理11-20

热门文章

  1. 强烈推荐 10 款珍藏的 Chrome 浏览器插件
  2. IDM\FDM下载器使用指南
  3. 牛客网 测试开发笔试题 含解析
  4. 软件保护器:Themida 3.1.14 Crack
  5. Win11一键还原win10右键菜单
  6. 推荐扔物线的HenCoder Android 开发进阶系列 后期接着更新
  7. 基于DE1 SOC FPGA开发板的数字时钟的制作
  8. PHP 后台模板推荐
  9. Winner(翻译)
  10. 服务器硬盘 主板,服务器硬盘主板电源一批