链接:https://www.nowcoder.com/acm/contest/136/E
来源:牛客网

题目描述

善弈者谋势,不善弈者谋子。

                                        ——《弈林新编》

蒟蒻HtBest与神犇WHZ下棋(五子棋),HtBest执黑棋,WHZ执白棋。由于HtBest天资愚笨,不会判断输赢,所以需要你帮他开发一个判断五子棋输赢的程序。

输入描述:

第一行有2个正整数n,m,分别表示棋盘大小(n*n)和对弈步数。
接下来m行,每行两个正整数x

i

,y

i

 ,表示对弈者下棋的坐标,第2、4、6…行是HtBest下的棋子,第3、5、7…行是WHZ下的棋子。

输出描述:

第一行一个字符串s 和一个正整数num ,用空格隔开,分别表示对弈的胜负结果和该结果出现时的步数,如果HtBest胜则s=“HtBest”,num为HtBest胜利时的步数(为偶数),如果WHZ胜则s=“WHZ”,num为WHZ胜利时的步数(为奇数),如果对弈m步后胜负仍未定,则s=“UNK”,num=m。
提示:当棋盘上第一次有五个子连续排列(横竖斜都可)时,胜负已定。在这之后,两人有可能仍继续落子。

输入例子:
10 20
1 1
1 2
2 1
2 2
3 1
3 2
4 1
4 2
5 1
5 2
6 1
6 2
7 1
7 2
8 1
8 2
9 1
9 2
10 1
10 2
输出例子:
HtBest 9

-->

示例1

输入

复制

10 20
1 1
1 2
2 1
2 2
3 1
3 2
4 1
4 2
5 1
5 2
6 1
6 2
7 1
7 2
8 1
8 2
9 1
9 2
10 1
10 2

输出

复制

HtBest 9

说明

在第9步时,HtBest获胜,当前局面:

示例2

输入

复制

10 27
8 6
9 4
2 1
7 5
4 7
8 4
4 3
5 4
10 3
5 5
9 7
9 5
3 4
6 3
5 10
1 5
9 2
6 5
5 7
1 4
2 5
8 5
1 3
3 2
8 3
2 6

输出

复制

WHZ 22

说明

在第22步时,WHZ获胜,当前局面:

示例3

输入

复制

10 1
1 1

输出

复制

UNK 1

说明

下一手后,胜负未分。

备注:

对于100%的测试数据:
1 ≤ n ≤ 1000
1 ≤ m ≤ 100000 发现小白赛后面的题目好水呀。。
这题目比赛的时候竟然没有多少人做。。
卡在前面的题目挺难受的。。
分析:在每次HtBest或者WHZ下棋的时候,判断下他下的这布棋是否可以获胜
  获胜的条件,遍历行,列,两种斜线看是否有五个棋子,写几个for循环判断
AC代码:
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define ls (r<<1)
#define rs (r<<1|1)
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
const ll maxn = 1e6+10;
const double eps = 1e-8;
const ll mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
ll n, m, mapn[1005][1005];
bool ok( ll x, ll y ) {
ll cnt = 1;
//下面两个循环判断行是否有五颗棋子
for( ll i = x-1; i >= 1; i -- ) {
if( mapn[i][y] == mapn[x][y] ) {
cnt ++;
} else {
break;
}
if( cnt >= 5 ) {
return true;
}
}
for( ll i = x+1; i <= n; i ++ ) {
if( mapn[i][y] == mapn[x][y] ) {
cnt ++;
} else {
break;
}
if( cnt >= 5 ) {
return true;
}
}
cnt = 1;
//下面两个循环判断列是否有五颗棋子
for( ll i = y-1; i >= 1; i -- ) {
if( mapn[x][i] == mapn[x][y] ) {
cnt ++;
} else {
break;
}
if( cnt >= 5 ) {
return true;
}
}
for( ll i = y+1; i <= n; i ++ ) {
if( mapn[x][i] == mapn[x][y] ) {
cnt ++;
} else {
break;
}
if( cnt >= 5 ) {
return true;
}
}
cnt = 1;
//下面两个循环判断左斜线是否有五颗棋子
for( ll i = x-1, j = y-1; i >= 1 && j >= 1; i --, j -- ) {
if( mapn[i][j] == mapn[x][y] ) {
cnt ++;
} else {
break;
}
if( cnt >= 5 ) {
return true;
}
}
for( ll i = x+1, j = y+1; j <= n && i <= n; i ++, j ++ ) {
if( mapn[i][j] == mapn[x][y] ) {
cnt ++;
} else {
break;
}
if( cnt >= 5 ) {
return true;
}
}
cnt = 1;
//下面两个循环判断右斜线是否有五颗棋子
for( ll i = x-1, j = y+1; i >= 1 && j <= n; i --, j ++ ) {
if( mapn[i][j] == mapn[x][y] ) {
cnt ++;
} else {
break;
}
if( cnt >= 5 ) {
return true;
}
}
for( ll i = x+1, j = y-1; i <= n && j >= 1; i ++, j -- ) {
if( mapn[i][j] == mapn[x][y] ) {
cnt ++;
} else {
break;
}
if( cnt >= 5 ) {
return true;
}
}
return false;
}
int main() {
ios::sync_with_stdio(0);
cin >> n >> m;
memset(mapn,0,sizeof(mapn));
bool flag = false;
for( ll i = 1, x, y; i <= m; i ++ ) {
cin >> x >> y;
if(i&1) {
mapn[x][y] = 1;
} else {
mapn[x][y] = 2;
}
if(!flag) {
if(ok(x,y)) {
if(i&1) {
cout << "HtBest " << i << endl;
} else {
cout << "WHZ " << i << endl;
}
flag = true;
}
}
}
if(!flag) {
cout << "UNK " << m << endl;
}
return 0;
}

  

牛客小白月赛6 E 对弈 思维的更多相关文章

  1. 牛客小白月赛4 J 强迫症 思维

    链接:https://www.nowcoder.com/acm/contest/134/J来源:牛客网 题目描述 铁子最近犯上了强迫症,他总是想要把一个序列里的元素变得两两不同,而他每次可以执行一个这 ...

  2. 牛客小白月赛4 B 博弈论 思维 字符串

    链接:https://www.nowcoder.com/acm/contest/134/B来源:牛客网 题目描述 铁子和顺溜在学习了博弈论的sg函数之后,解决了很多很多博弈题,现在他们遇到了一道难题. ...

  3. 牛客小白月赛19 E 「火」烈火燎原 (思维,树)

    牛客小白月赛19 E 「火」烈火燎原 (思维,树) 链接:https://ac.nowcoder.com/acm/contest/2272/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空 ...

  4. 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花

    求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...

  5. 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?

    牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...

  6. 牛客小白月赛8 - E - 诡异数字 数位DP

    牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...

  7. 牛客小白月赛18 Forsaken给学生分组

    牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 ​ Forsaken有 ...

  8. 牛客小白月赛18 Forsaken喜欢数论

    牛客小白月赛18 Forsaken喜欢数论 题目传送门直接点标题 ​ Forsaken有一个有趣的数论函数.对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子.如果这个数没有最小质 ...

  9. 【牛客小白月赛21】NC201604 Audio

    [牛客小白月赛21]NC201604 Audio 题目链接 题目大意: 给出三点 ,求到三点距离相等的点 的坐标. 解析 考点:计算几何基础. 初中蒟蒻表示不会什么法向量.高斯消元..qwq 方法一: ...

随机推荐

  1. 读JDK源码集合部分

    以前读过一遍JDK源码的集合部分,读完了一段时间后忘了,直到有一次面试简历上还写着读过JDK集合部分的源码,但面试官让我说说,感觉记得不是很清楚了,回答的也模模糊糊的,哎,老了记性越来越差了,所以再回 ...

  2. 用lilypond实现模进

    基本练习通常是一个两个简单动作在不同位置上反复操练,所以打谱的时候用模进必不可少. 所谓模进,就是把一个片段平行地转移到其他音高上进行.比如 do re mi fa 可以把从do开始改成从so开始,那 ...

  3. jenkins部署自动化项目备注

    一.定时任务部署: 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个*表示第几月,取值1~12 第五个*表示一周中的第几天,取值0~7, ...

  4. Two types of people with high scores of English exams

    I believe that there are two types of people who get high scores in English exams: 1) have high inte ...

  5. [原创实践]redhat linux 5.3搭建Nexus

    1:下载安装JDK,配置好环境变量(JAVA_HOME等) 下载linux下64位的jdk-7u45-linux-x64.tar.gz(百度网盘下载,官网的jdk-7u51-linux-x64.tar ...

  6. Source Maps简介

    提高网站性能最简单的方式之一是合并压缩JavaScript和CSS文件.但是当你需要调试这些压缩文件中的代码时,那将会是一场噩梦.不过也不用担心,souce maps将会帮你解决这一问题. Sourc ...

  7. .net core + mvc 手撸一个代码生成器

    最近闲来无事,总想倒腾点什么,索性弄下代码生成器,这里感谢叶老板FreeSql的强大支持. 以前也用过两款不错的代码生成器,这里说说我的看法 1.动软代码生成器,优点很明显,免费,简单,但是没法高度自 ...

  8. R 包 rgl 安装失败, 报错 X11 not found but required, configure aborted 及解决方法

    R 包 rgl 安装失败, X11 not found but required, configure aborted * installing *source* package ‘rgl’ ... ...

  9. SoapUI使用教程---简介、下载、破解

    最近项目中要使用到SoapUI这款测试工具,之前有接触过,但好久没用了,借此机会记录并和大家分享一下. 一.soapui简介 soapui是一款开源测试工具,通过soap/http来检查.调用.实现W ...

  10. Linux x86和x64的区别

    0x01:寄存器分配的不同 (1)64位有16个寄存器,32位只有8个.但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _.e开头的寄存器命名依然可以直接运用于 ...