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
随机推荐
- <a>之间怎么放值</a> 挺简单的,第一次遇到···
需求描述:对列表中的某一列内容添加a标签(其实就是对td标签下添加a标签了). 思路简介:拿到这个我首先的反应就是在td标签对text获取内容的代码中动态拼接<a></a>字符 ...
- Python基础之模块与包
一.模块 1.什么是模块? 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.为何要使用模块? 如果你退出python解释器然后重新进入,那么你之前定义的函 ...
- eclipse java ee ide 配置
配置WEB服务器 windows->preferences->server->Runtime-Environments->Add->选择对应版本->选择安装路径-& ...
- GAN-生成对抗网络原理
最近一直在看GAN,我一直认为只有把博客看了一遍,然后再敲一遍.这样才会有深刻的感悟. GAN(生成式对抗网络)(GAN, Generative Adversarial Networks )是一种深度 ...
- VMware搭建虚拟机服务器
一.需求点描述: 1.在有路由器的情况下,能够通过固定的外网IP访问路由器中某台实体机中运行的虚拟机. 2.能够通过外网IP访问该虚拟机中的ftp.远程连接.iis.tomcat等. 二.原理分析: ...
- Sway
啥是Sway: http://livesino.net/archives/7520.live 地址:http://sway.com 现在又可以申请了 试试效果
- Windows Server 2012 R2 设置 NTP 服务
其实和以前的server版本配置没啥不一样 都是先改注册表: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\ ...
- Java集合源码学习(四)HashMap
一.数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景,数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易:哈希表的实现结合了这两点, ...
- 使用sparkSQL的insert操作Kudu
可以选择使用Spark SQL直接使用INSERT语句写入Kudu表:与'append'类似,INSERT语句实际上将默认使用UPSERT语义处理: import org.apache.kudu.sp ...
- Codeforces 666E E - Forensic Examination SA + 莫队 + 线段树
E - Forensic Examination 我也不知道为什么这个复杂度能过, 而且跑得还挺快, 数据比较水? 在sa上二分出上下界, 然后莫队 + 线段树维护区间众数. #include< ...