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
随机推荐
- DSB
Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...
- wireless Penetration Testing & Honeypot and Mis-Association attacks
重新记一遍 ,在捕获握手数据包的时候不容易获取,所以使用ARP请求.使用自己的无线网卡的地址发送请求,会容易使得无线开启端掉线,迫使重新连接. 1.使用命令 aireplay-ng -3 -b a ...
- 古代猪文:数论大集合:欧拉定理,exgcd,china,逆元,Lucas定理应用
/* 古代猪文:Lucas定理+中国剩余定理 999911658=2*3*4679*35617 Lucas定理:(m,n)=(sp,tp)(r,q) %p 中国剩余定理:x=sum{si*Mi*ti} ...
- Nginx详解二十六:Nginx架构篇之性能优化
一.性能优化考虑点 1.当前系统结构瓶颈 通过压力测试观察指标.日志检测.性能分析 2.了解业务模式 接口业务类型.系统层次化结构 3.性能与安全 二.ab接口压力测试工具 1.安装:yum -y i ...
- jdbc问题:Access denied for user ''@'localhost''是因为没输入账户和密码
Access denied for user ''@'localhost' to database 'bjpowernode'
- Python(列表操作应用实战)
# 输入一个数据,删除一个列表中的所有指定元素# 给定的列表数据data = [1,2,3,4,5,6,7,8,9,0,5,4,3,5,"b","a",&quo ...
- ubuntu 出错 /etc/sudoers is world writable
如果改变了这个,目录的权限sodu就不能用了,当你再使用sodu命令就会爆如下问题: sudo: /etc/sudoers is world writablesudo: no valid sudoer ...
- Hyper-V 替换 vmwp
要激活 Hyper-V 下的虚机 最简单的方法是用带证书的vmwp替换掉原来的 带证书的vmwp参见:http://bbs.pcbeta.com/viewthread-1408240-1-1.html ...
- 易企秀H5 json配置文件解密分析
最近需要参考下易企秀H5的json配置文件,发现已经做了加密,其实前端的加密分析起来只是麻烦点. 抓包分析 先看一个H5: https://h5.eqxiu.com/s/XvEn30op F12可以看 ...
- ionic2程序调试
新手一枚,之前一直做.net开发,最近接触Ionic2,也没有人带,只能自己一点点抠文档,查资料.一直苦于无法直接调试打包发不好的app,只能在代码里面加上alert一点一点的抛出要看信息,感觉就像瞎 ...