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
随机推荐
- 《剑指offer》 二进制中1的个数
本题来自<剑指offer> 二进制中1的个数 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 两种思路: 第一种:对n进行左移,检测最后一位是否为1,但考 ...
- laravel 实现一个简单的 RESTful API
创建一个 Article 资源 php artisan make:resource Article 你可以在 app/Http/Resources 目录下看到你刚刚生成的 Article 资源 当然我 ...
- 基于Manhattan最小生成树的莫队算法
点u,v的Manhattan距离:distance(u,v)= |x2-x1|+|y2-y1| Manhattan最小生成树:边权值为两个点Manhattan距离的最小生成树. 普通算法:prim复杂 ...
- Jmeter中通过beanshell写入CSV的脚本
import com.csvreader.CsvWriter; String NewDataPath=bsh.args[0]; NewDataPath=NewDataPath.replaceAll(& ...
- 论文阅读笔记十四:Decoupled Deep Neural Network for Semi-supervised Semantic Segmentation(CVPR2015)
论文链接:https://arxiv.org/abs/1506.04924 摘要 该文提出了基于混合标签的半监督分割网络.与当前基于区域分类的单任务的分割方法不同,Decoupled 网络将分割与分类 ...
- StackService.Redis 应用
如今StackService.Redis已经转向商业版本.4.0以下的低版本依然免费和开源. 吴双,Redis系列命令拾遗分享 http://www.cnblogs.com/tdws/tag/NoSq ...
- 什么是redis的雪崩和穿透
缓存雪崩 如何应对缓存雪崩 首先要保证redis的高可用,可以使用redis cluster,开启redis持久化,redis之前要使用本地缓存,请求先走本地缓存,没找到再走redis 如果还是出现了 ...
- python爬虫实例
import re import requests from bs4 import BeautifulSoup # 主方法 def main(): # 给请求指定一个请求头来模拟chrome浏览器 h ...
- [转] Mongoose 参考手册
Mongoose 参考手册 标签(空格分隔): MongoDB Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据 ...
- bzoj 5099: [POI2018]Pionek
题解: 还是比较简单的一道题 考虑现在有一个向量,当且仅当下一个向量与它夹角<90度这个向量的模长才会增加 接下来怎么做呢 如果我们去枚举初始向量,向量方向会随着新增向量而变化 随着不断顺时针的 ...