我们最后选题策略失败,选到五子棋这题,没想到这题非常麻烦,最后也没做出来!

比赛结束后发了题解再做才做出来! 不得不说 这题真的很麻烦

一个需要比较细致分类讨论的题目。判定棋盘是否合法应考虑如下几种情况:
• 黑先手,因此白子不可能多于黑子,且两种石子数量之差不超过 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 五子棋的更多相关文章

  1. (2015年郑州轻工业学院ACM校赛题) E 汇编原理

    此题属于比较麻烦的模拟题,比赛的时候是队友写的, 比赛结束之后自己也写了一遍,感觉对复杂模拟的掌控还是不行! 解析: 我感觉 ADD操作 和 MOV操作比较类似 所以就写在了一块,MUL操作单独写就行 ...

  2. (2015年郑州轻工业学院ACM校赛题) C 数列

    在我们做完B题之后就去看C题了, 发现很多人都已经做出来了, 并且一血还是我们学弟拿的, 感觉这题不难, 我们举了几个例子之后发现全是Alice 然后我们就决定意淫一下,试试看! 没想到就A了 - . ...

  3. (2015年郑州轻工业学院ACM校赛题) B迷宫

    这是个简单的广搜题,注意下一下细节都能写出来, 大多数人都少考虑了一点,就是 假如 我的起始点就有一个机关, 并且不是 1 号机关, 这样的话是无结果的.不懂的可以测试一下代码下面的数据 #inclu ...

  4. (2015年郑州轻工业学院ACM校赛题) A 彩票

    这是个简单的题目,其实就是判断是否是偶数, 对二进行特判一下就行了! 比赛时候我们还错两次................ 一看简单题就想抢一血,谁知到第一次提交CE, 再提交WA 汗........ ...

  5. (2015年郑州轻工业学院ACM校赛题) J 堆

    判断是否是一个堆,把树构造好遍历一遍就OK了 #include<stdio.h> #include<iostream> #include<stack> #inclu ...

  6. (2015年郑州轻工业学院ACM校赛题)I 旋转图像

    矩阵旋转,写一个转 90° 的函数就行了, 注意每次要将 长和宽的值进行交换就行了. #include<stdio.h> #include<iostream> #include ...

  7. (2015年郑州轻工业学院ACM校赛题) G 矩阵

    看这道题的时候就感觉用一点动归思想+暴力 就能过了. #include<stdio.h> #include<iostream> #include<stack> #i ...

  8. 20170416郑州市轻工业学院ACM校赛

    这是个星期天,但是,这种非一线城市,重点城市什么的高中,放假从来不按套路出牌,几乎可以说能给你一天是福气.当然,比县里好的多,问在县里上高中的初中同学,放假更是比我们一天里的午休+晚上吃饭时间还要少. ...

  9. 第八届郑州轻工业学院ACM(程序设计大赛)校内预选赛

    郑州轻工业学院有一个大赛,把几个有趣的题目分享一下.下面是题目连接,喜欢了就点点... 斗破苍穹 礼上往来 统计人数 神の数 炉石传说 Mathematics and Geometry 马拉松后记 斗 ...

随机推荐

  1. 数据库系统——B+树索引

    原文来自于:http://dblab.cs.toronto.edu/courses/443/2013/05.btree-index.html 1. B+树索引概述 在上一篇文章中,我们讨论了关于ind ...

  2. oracle中imp命令具体解释

    oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件.imp使用的基本格式:imp[username[/pass ...

  3. Java 类的热替换---转载

    构建基于 Java 的在线升级系统 Java ClassLoader 技术剖析 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于和构建在线升级系统相关的基础 ...

  4. git使用介绍

    Git简单介绍 参考网址: git使用简介 这个教程推荐使用:git教程 git和svn的差异 git和svn的最大差异在于git是分布式的管理方式而svn是集中式的管理方式.如果不习惯用代码管理工具 ...

  5. [转] Java快速教程

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Java是面向对象语言.这门语言其实相当年轻,于1995年才出现,由Sun公司出品 ...

  6. UIView不能使用UITableView的Static表格的解决方法

    在UIView中嵌入一个Container,用Container来包含UITableViewController即可,到storyboard上显示如下:

  7. jquery在ie浏览器下中文乱码的问题

    用jquery的ajax方法在调用后台数据发现中文乱码,无法解析中文的url,而在别的浏览器下面就不会,如下所示 $.ajax({ type:'get', url:'薛之谦-演员.lrc', asyn ...

  8. (转)iFrame高度自适应

    第一种方法:代码简单,兼容性还可以,大家可以先测试下: function SetWinHeight(obj) { var win=obj; if (document.getElementById) { ...

  9. asp.net中Request.ServerVariables的用法

    在asp.net中可以通过HttpRequest.ServerVariables 属性来获取“ Web 服务器变量的集合” HttpRequest.ServerVariables 的用法: HttpR ...

  10. 写一个基于NSURLSession的网络下载库

    前段时间AFNetworking 更新到3.0 ,彻底废弃NSURLConnection的API转由NSURLSession来实现,代码并没有改动很大,AF封装的很好了,读完源码感觉收获很大. 下载不 ...