UVA 220 Othello
题意:输入n,代表次数,每次输入8*8的棋盘,处理3种命令:①L:打印所有合法操作,②M:放棋子,③Q:打印棋盘然后退出。
思路:①用字符数组存棋盘,整型数组存合法位置。
②查找的方法:当前玩家为cur,遍历棋盘,发现棋子颜色为cur,就从此位置,向8个方向查找,查找到有back(对手),就置flag为1,
继续查找,查找到'-',即为合法位置,记录此位置,换方向查找。
③放棋子:和查找思路类似,修改放下的棋子后,从此位置向8个方向查找,查找到cur,cntBack++,继续查找,查找到有back,置flag为1,
只有flag=1且cntBack!=0,才代表可以修改其中的back,满足则循环修改。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
char board[][],cur,cmd,back;
int legal[][],hasLegal,numb,numw;
int n;
void find()//查找合法位置
{
int count=,count2=;
hasLegal=;
memset(legal,,sizeof(legal));
// curnum=backnum=0;
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
if(board[i][j]==cur)
{
int next[][]={{,},{,},{,-},{-,},{-,},{,},{,-},{-,-}};//右,下,左,上,右上,右下,左下,左上
int nextx=i,nexty=j;
// printf("1(%d,%d)\n",nextx+1,nexty+1);
for(int k=;k<;k++,nextx=i,nexty=j)
{
int flag=;
nextx+=next[k][];
nexty+=next[k][];
// printf("k=%d 2(%d,%d)\n",k,nextx+1,nexty+1);
if(nextx>||nextx<||nexty>||nexty<)
continue;
// printf("(%d,%d)=%c back=%c\n",nextx,nexty,board[nextx][nexty],back);
if(board[nextx][nexty]==back)
{
flag=;
// printf("flag=1\n");
}
while(flag&&board[nextx][nexty]!=cur)
{
nextx+=next[k][];
nexty+=next[k][];
// printf("3(%d,%d)=1\n",nextx+1,nexty+1);
if(nextx>||nextx<||nexty>||nexty<)
break;
if(board[nextx][nexty]=='-')
{
legal[nextx][nexty]=;
// printf("real(%d,%d)=1\n",nextx+1,nexty+1);
count++;
break;
}
}
}
}
}
}
if(count!=)
{
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
if(legal[i][j]!=)
{
if(count2==)
{
count2++;
}
else
printf(" ");
printf("(%d,%d)",i+,j+);
}
}
}
printf("\n");
}
else
{
printf("No legal move.\n");
hasLegal=;
}
}
void cnt()//输出棋子颜色和个数
{
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
if(board[i][j]=='B')
numb++;
else if(board[i][j]=='W')
numw++;
}
}
}
void change(int r,int c)//修改棋子
{
int next[][]={{,},{,},{,-},{-,},{-,},{,},{,-},{-,-}};
int nextx=r,nexty=c,cntBack,flag;
board[r][c]=cur;
// printf("change board[%d][%d]=%c\n",r+1,c+1,board[r][c]);
for(int k=;k<;k++,nextx=r,nexty=c)
{
cntBack=;
flag=;
while(board[nextx][nexty]!='-')
{
nextx+=next[k][];
nexty+=next[k][];
if(nextx<||nextx>||nexty<||nexty>)
break;
if(board[nextx][nexty]==back)
cntBack++;
if(board[nextx][nexty]==cur)
{
flag=;
break;
}
}
// printf("cntback=%d\n",cntBack);
if(cntBack!=&&flag)
{
int nexti=r,nextj=c,l;
for(l=,nexti+=next[k][],nextj+=next[k][];l<cntBack;l++,nexti+=next[k][],nextj+=next[k][])
{
// printf("board[%d][%d]",nexti+1,nextj+1);
board[nexti][nextj]=cur;
// printf("board[%d][%d]=%c\n",nexti+1,nextj+1,board[nexti][nextj]);
}
}
}
}
void print()//打印
{
for(int i=;i<;i++)
printf("%s\n",board[i]);
if(n!=)
printf("\n");//除最后一行都要输出一个空行
}
int main()
{
// FIN;
// FOUT;
char r,c,ch;
scanf("%d",&n);
while(n--)
{
for(int i=;i<;i++)
{
scanf("%s",board[i]);
}
ch=getchar();
scanf("%c",&cur);
if(cur=='W')
back='B';
else
back='W';
// memset(legal,0,sizeof(legal));//输出测试
// for(int i=0;i<8;i++)
// printf("%s\n",board[i]);
// printf("cur=%c\n",cur);
while(cmd=getchar())
{
if(cmd=='Q')
{
//打印
print();
// if(n!=0)
// printf("XXX\n");
break;
}
else if(cmd=='L')
{
// printf("input L\n");
find();
if(!hasLegal)
{
ch=cur;
cur=back;
back=ch;
}
// printf("cur=%c\n",cur);
}
else if(cmd=='M')//每次M都要统计输出
{
scanf("%c%c",&r,&c);
// printf("r=%c c=%c\n",r,c);
//修改
change(r-''-,c-''-);
numb=numw=;
cnt();
//输出统计
printf("Black -%3d White -%3d\n",numb,numw);
// print();//打印看看,记得删除
ch=cur;
cur=back;
back=ch;
}
}
}
return ;
}
UVA 220 Othello的更多相关文章
- 【习题 4-3 UVA - 220】Othello
[链接] 我是链接,点我呀:) [题意] [题解] legal被我打成leagal... 然后注意输出坐标的时候,格式是%2d.. 然后就没啥难的了.. [代码] #include <bits/ ...
- [刷题]算法竞赛入门经典(第2版) 4-3/UVa220 - Othello
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,0 ms) //UVa 220 - Othello #include<iostream ...
- uva 10581 - Partitioning for fun and profit(记忆化搜索+数论)
题目链接:uva 10581 - Partitioning for fun and profit 题目大意:给定m,n,k,将m分解成n份,然后依照每份的个数排定字典序,而且划分时要求ai−1≤ai, ...
- UVa 10012 - How Big Is It? 堆球问题 全排列+坐标模拟 数据
题意:给出几个圆的半径,贴着底下排放在一个长方形里面,求出如何摆放能使长方形底下长度最短. 由于球的个数不会超过8, 所以用全排列一个一个计算底下的长度,然后记录最短就行了. 全排列用next_per ...
- UVA.12169 Disgruntled Judge ( 拓展欧几里得 )
UVA.12169 Disgruntled Judge ( 拓展欧几里得 ) 题意分析 给出T个数字,x1,x3--x2T-1.并且我们知道这x1,x2,x3,x4--x2T之间满足xi = (a * ...
- Fast Matrix Operations(UVA)11992
UVA 11992 - Fast Matrix Operations 给定一个r*c(r<=20,r*c<=1e6)的矩阵,其元素都是0,现在对其子矩阵进行操作. 1 x1 y1 x2 y ...
- Android Weekly Notes Issue #220
Android Weekly Issue #220 August 28th, 2016 Android Weekly Issue #220 ARTICLES & TUTORIALS Manag ...
- PIC10F200/202/204/206/220/222/320/322芯片解密程序复制多少钱?
PIC10F200/202/204/206/220/222/320/322芯片解密程序复制多少钱? PIC10F单片机芯片解密型号: PIC10F200解密 | PIC10F202解密 | PIC10 ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
随机推荐
- Winhex数据恢复笔记(五)
一.上次介绍了Windows API函数,这次对Windows API函数的参数做个笔记 1.IpFileName: 文件名指针,也可指向 MS-Dos设备名,同时支持文件和设备名,函数分为两个版本 ...
- matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量,图片的读入等内容)
MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] ...
- 2017-2018-2 20165328 实验三《敏捷开发与XP实践》实验报告
一.实践-1: 要求:参考http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD安装alibaba插件,解决代码中的规范问题. 在ID ...
- Elasticsearch集群
详细Elasticsearch安装: https://www.cnblogs.com/littlehb/p/8406378.html 安装之前需先优化内核: https://www.cnblogs.c ...
- MySQL主从备份配置实例
转载自:https://www.cnblogs.com/ahaii/p/6307648.html MySQL主从备份配置实例 场景: 1.主服务器192.168.0.225.从服务器192.168.0 ...
- [转] babel-plugin-react-css-modules配置
自己的react项目用到了css-modules,由于不太想在写className时写style.xxx于是google解决方案,找到了这货->babel-plugin-react-css-mo ...
- linux实现自动检测进程是否存活的脚本
可以在性能测试过程中.定期检测startAgent和nmon的状态 #!/bin/sh while true do pnmon=`ps aux | grep nmon | grep -v grep`; ...
- python 类、函数的引用
类的引用 一.同级目录引用: from 文件名 import 类名 如果报错,原因基本上就是:pycharm不会将当前文件目录自动加入自己的sourse_path. 解决方法: ...
- vue-cli 部分浏览器不支持es6的语法-babel-polyfill的引用和使用
npm install --save-dev babel-polyfill babel-polyfill用正确的姿势安装之后,引用方式有三种: 1.require("babel-polyfi ...
- Berlekamp-Massey算法简单介绍
请阅读本文的同学们注意:之前这篇博客和所附代码有点问题,求的不一定是最短递推式,非常抱歉 看毛爷爷的论文大概断断续续看了一个月了,看得不是很懂,google了一波好像很快就看懂了,就先口胡一下这个算法 ...