链接: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. 【iOS】arc4random() 产生随机数

    通过 arc4random() 获取 0 到 x-1 之间的整数的代码如下: int value = arc4random() % x; 获取 1 到 x 之间的整数的代码如下: ; PS: 这里用到 ...

  2. 工业物联网网关在线探测之TraceRoute

    佰马工业物联网网关BMG500在线探测通常有Ping.DNS.TraceRoute三种技术方式,这三种方式的区别与联系是什么?本文着重介绍工业物联网网关在线探测的工作原理,以图文形式介绍无线网关在线探 ...

  3. Ubuntu中修改默认开机项

    1首先,按住Ctrl+Alt+t打开终端 2输入cd /etc/default 3输入sudo sudo nano grub 并按照提示输入密码 4在我们开机的时候,可以看到自己想要默认的开机项是多少 ...

  4. PPT | Docker定义存储-让应用无痛运行

    编者注: 本文为9月27日晚上8点有容云平台存储架构师张朝潞在腾讯课堂中演讲的PPT,本次课堂为有容云主办的线上直播Docker Live时代●Online Meetup-第三期:Docker定义存储 ...

  5. JAVA面向对象面试题带答案(墙裂推荐)

    1) 在Java中,如果父类中的某些方法不包含任何逻辑,并且需要有子类重写,应该使用(c)关键字来申明父类的这些方法. a) Finalc b) Static c) Abstract d) Void2 ...

  6. Robotframework获取移动端toast问题

    背景: 在做移动端自动化测试的时候,经常会遇到一个问题就是获取toast提示问题,如果需要解决这个问题需要重新处理,不能按照正常的逻辑,使用robotframework自带的关键字进行获取,需要重新考 ...

  7. Postman系列一:Postman安装及使用过程中遇到的问题

    一:Postman的简介.下载安装及界面说明 1.Postman的简单介绍 Postman是一款强大的网页调试和发送网页HTTP请求的工具,Postman让开发和测试人员做API(接口)测试变得更加简 ...

  8. 死磕JVM之类中各部分的加载顺序

    话不多说,直接上代码: 1.通过new创建对象实例: 2.当对象中含有静态方法,且调用时: -- 调用父类静态方法: 总结: * 类中静态资源首次加载的时间是类中静态资源第一次被调用的时候或者该类的对 ...

  9. java并发编程(八)----(JUC)CountDownLatch

    CountDownLatch 是一个非常实用的多线程控制工具类." Count Down " 在英文中意为倒计数, Latch 为门问的意思.如果翻译成为倒计数门阀, 我想大家都会 ...

  10. Promise 学习心得

    当了这么久码农到今天没事才开始去深究 Promise 这个对象 什么是 Promise, Promise 有什么用? 在写代码的时候多多少少都有遇见过地狱式的回调 代码看起来没问题就是有点乱,Prom ...