(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 马拉松后记 斗 ...
随机推荐
- configure JAAS for jboss 7.1 and mysql--reference
Hello all, In this tutorial we are going to configure JAAS for jboss 7.1 and mysql for Form based au ...
- session绑定javaBean
1.HttpSessionBindingListener 这个监听器,可以让javaBean对象,感知它被绑定到session中或从session中移除.2.HttpSessionActivati ...
- Android(java)学习笔记247:ContentProvider使用之利用ContentProvider备份和还原手机短信(掌握)
1.通过阅读系统源码我们知道: 短信的内容提供者: content://sms/ 系统短信的内容提供者的路径 2. 利用ContentProvider备份和还原手机短信: (1) ...
- HDU 3533 Escape(bfs)
Escape Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- iOS图片拉伸
常用的图片拉伸场景有:聊天页面的气泡,需要根据内容拉伸,但圆角拉伸后会变形,为避免圆角拉伸,可以指定拉伸区域.UIImage实体调用以下方法即可指定拉伸区域. - (UIImage *)stretch ...
- 【CSS中width、height的默认值】
对于初学者来说,CSS中的width.height的默认值是很神奇的,因为经常看到如下这样的代码:明明只给一个#father标签(红色的div)设置了一个width,为啥它在浏览器中显示出来是有一个固 ...
- ASP.NET面试
1.net中读写数据库需要用到那些类?他们的作用都是什么?答:DataSet:数据存储器.DataCommand:执行语句命令.DataAdapter:数据的集合,用语填充.2.介绍一下什么是Code ...
- 在CSS文件中引入其他CSS文件
引入CSS的方法有两种,一种是@import,一种是link 一.@import url('地址');二.<link href="地址" rel="styleshe ...
- 把某个asp.net 控件 替换成 自定义的控件
功能:可以把某个asp.net 控件 替换成 自定义的控件 pages 的 tagMapping 元素(ASP.NET 设置架构) 定义一个标记类型的集合,这些标记类型在编译时重新映射为其他标记类型. ...
- wpf Content数据绑定StringFormat起作用的原理和解决(转)
1.简单示例: <Window x:Class="WpfOne.Bind.Bind6" xmlns="http://schemas.microsoft.com/wi ...