(2015年郑州轻工业学院ACM校赛题)H 五子棋
我们最后选题策略失败,选到五子棋这题,没想到这题非常麻烦,最后也没做出来!
比赛结束后发了题解再做才做出来! 不得不说 这题真的很麻烦
一个需要比较细致分类讨论的题目。判定棋盘是否合法应考虑如下几种情况:
• 黑先手,因此白子不可能多于黑子,且两种石子数量之差不超过 1;
• 如果黑胜,当前黑子比白子多 1;
• 如果白胜,当前黑白石子数量相等;
• 两方不能同时胜利,即不能出现两方同时有五子相连的情况;
将上述情况判定清楚后,如果没有一方有五子相连则输出 other,否则对于胜的一方,枚举它最后
一步放的是哪个棋子。如果存在这样一个棋子,将它拿走之后局面上就没有五子连珠了,那么我们就可
以到达这个局面(证明略),那么就输出相应的棋子颜色;如果不存在的话(例如棋盘上有 10 个连续的
黑子)则说明局面非法,直接输出 fault 即可。
#include<stdio.h>
#include<iostream>
#include<stack>
#include<queue>
#include<math.h>
#include<stdlib.h>
#include<cstring>
#include<algorithm>
using namespace std;
#define Max(a,b) (a>b?a:b)
#define Min(a,b) (a<b?a:b)
#define INF 0xfffffff
#define maxn 110
#define WHITE 1
#define BLACK 2
#define FAULT 3
#define OTHER 4
int n, m, num;
char maps[maxn][maxn];
int dir[][] = { {-,-},{-,},{-,},{,-} }; void Search(int x,int y,char ch,int k)
{
num ++;
int nx = x + dir[k][];
int ny = y + dir[k][]; if(nx >= && nx < n && ny >= && ny < m && maps[nx][ny] == ch )
Search(nx, ny, ch, k);
} int MaxNum(char ch)
{
int ans = ;
for(int i=; i<n; i++)
{
for(int j=; j<m; j++)
{
if(maps[i][j] == ch)
{
for(int k=; k<; k++)
{
num = ;
Search(i,j,ch,k);
ans = max(ans,num);
}
}
}
}
return ans;
} bool Fault(char ch)
{
int i, j, k, p, nx, ny;
for(i=; i<n; i++)
{
for(j=; j<m; j++)
{
if( maps[i][j] == ch )
{
for(k=; k<; k++)
{
num = ;
Search(i,j,ch,k);
if(num >= )
{
for(p=; p<; p++)
{
nx = i + dir[k][] * p;
ny = j + dir[k][] * p;
maps[nx][ny] = '.';
} if(MaxNum(ch) >= )
return true; for(p=; p<; p++)
{
nx = i + dir[k][] * p;
ny = j + dir[k][] * p;
maps[nx][ny] = ch;
} }
}
}
}
}
return false;
} int Slove()
{
int White = , Black = ;
int MaxWhite = , MaxBlack = ;
int i, j;
for(i=; i<n; i++)
{
for(j=; j<m; j++)
{
if(maps[i][j] == '')
White ++;
if(maps[i][j] == '')
Black ++;
}
} MaxWhite = MaxNum('');
MaxBlack = MaxNum(''); if(MaxWhite > || MaxBlack > || Black-White >= || Black < White )
return FAULT; if(Fault('')||Fault('') || (MaxWhite >= && MaxBlack >= ) || (MaxWhite >= && Black != White)|| (MaxBlack >= && Black- != White))
return FAULT;
if(MaxWhite >= && Black == White)
return WHITE;
if(MaxBlack >= && Black- == White)
return BLACK; return OTHER; } int main()
{
int T, i, ans;
cin >> T; while(T--)
{
cin >> n >> m; for(i=; i<n; i++)
cin >> maps[i]; ans = Slove(); if(ans == WHITE)
printf("white\n");
else if(ans == BLACK)
printf("black\n");
else if(ans == OTHER)
printf("other\n");
else
printf("fault\n");
}
return ;
}
(2015年郑州轻工业学院ACM校赛题)H 五子棋的更多相关文章
- (2015年郑州轻工业学院ACM校赛题) E 汇编原理
此题属于比较麻烦的模拟题,比赛的时候是队友写的, 比赛结束之后自己也写了一遍,感觉对复杂模拟的掌控还是不行! 解析: 我感觉 ADD操作 和 MOV操作比较类似 所以就写在了一块,MUL操作单独写就行 ...
- (2015年郑州轻工业学院ACM校赛题) C 数列
在我们做完B题之后就去看C题了, 发现很多人都已经做出来了, 并且一血还是我们学弟拿的, 感觉这题不难, 我们举了几个例子之后发现全是Alice 然后我们就决定意淫一下,试试看! 没想到就A了 - . ...
- (2015年郑州轻工业学院ACM校赛题) B迷宫
这是个简单的广搜题,注意下一下细节都能写出来, 大多数人都少考虑了一点,就是 假如 我的起始点就有一个机关, 并且不是 1 号机关, 这样的话是无结果的.不懂的可以测试一下代码下面的数据 #inclu ...
- (2015年郑州轻工业学院ACM校赛题) A 彩票
这是个简单的题目,其实就是判断是否是偶数, 对二进行特判一下就行了! 比赛时候我们还错两次................ 一看简单题就想抢一血,谁知到第一次提交CE, 再提交WA 汗........ ...
- (2015年郑州轻工业学院ACM校赛题) J 堆
判断是否是一个堆,把树构造好遍历一遍就OK了 #include<stdio.h> #include<iostream> #include<stack> #inclu ...
- (2015年郑州轻工业学院ACM校赛题)I 旋转图像
矩阵旋转,写一个转 90° 的函数就行了, 注意每次要将 长和宽的值进行交换就行了. #include<stdio.h> #include<iostream> #include ...
- (2015年郑州轻工业学院ACM校赛题) G 矩阵
看这道题的时候就感觉用一点动归思想+暴力 就能过了. #include<stdio.h> #include<iostream> #include<stack> #i ...
- 20170416郑州市轻工业学院ACM校赛
这是个星期天,但是,这种非一线城市,重点城市什么的高中,放假从来不按套路出牌,几乎可以说能给你一天是福气.当然,比县里好的多,问在县里上高中的初中同学,放假更是比我们一天里的午休+晚上吃饭时间还要少. ...
- 第八届郑州轻工业学院ACM(程序设计大赛)校内预选赛
郑州轻工业学院有一个大赛,把几个有趣的题目分享一下.下面是题目连接,喜欢了就点点... 斗破苍穹 礼上往来 统计人数 神の数 炉石传说 Mathematics and Geometry 马拉松后记 斗 ...
随机推荐
- Spring中的AOP
什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...
- 站内信,群发与全部发送。Gson解析result
/** * 发送站内信 */@Permission(Module.TZGL)@RequestMapping(value = "/sendznx", method = Request ...
- bom头惹的祸!
今天使用json_decode函数解析json数据一直出错,最后发现j用浏览器开发者工具发现json数据前面多了个$#65279,查询得知是bom头; 网上找的去除bom头的代码如下: <?ph ...
- .net之页面生面周期
# 事件或方法 功能 描述 1 Init 事件 页面初始化 页面生存周期中的第一个阶段是初始化.当 Init 事件发生时,在.aspx 源文件中静态声明的所有控件都已实例化并取其默认值.应该注意的是, ...
- Day2 - Python基础2 列表、字典、集合
Python之路,Day2 - Python基础2 本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一, ...
- 注册表修改IP地址和DNS等信息
---------------------win8系统 1. 2. 3. --------------------------------------------------------------- ...
- c#隐式转换之有符号位转换
有符号位类型的转换,额外的高位用源表达式的符号位填充.这样就维持了被转换的值的正确符号和大小. 特别注意的是负数的转换,额外的高位用1填充,因为负数的二进制表示是对应正数的二进制取反加1,所以高位用1 ...
- Java面向对象的概念以及OOP思想的优点
传统面向过程程序设计的思路: 先设计一组函数用来解决一个问题,然后确定函数中需要处理的数据以及存储位置. 面向对象的设计的思路: 先确定处理的数据,然后确定处理数据的算法,最后将数据和算法封装在一起构 ...
- 高性能IO设计模式之阻塞/非阻塞,同步/异步解析
提到高性能,我想大家都喜欢这个,今天我们就主要来弄明白在高性能的I/O设计中的几个关键概念,做任何事最重要的第一步就是要把概念弄的清晰无误不是么?在这里就是:阻塞,非阻塞,同步,异步. OK, 现在来 ...
- ejabberd,erlang,简单看了一下,总结一下,很肤浅
本来也没打算深入学习erlang,就是看一下他们的大概思路erlang每个自定义函数都能注册成进程,每个节点通过erl -name 'name@ip'.进去后,可以直接做远程调用,节点之间就靠一个连接 ...