牛客小白月赛6 E 对弈 思维
链接: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
-->
备注:
对于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 对弈 思维的更多相关文章
- 牛客小白月赛4 J 强迫症 思维
链接:https://www.nowcoder.com/acm/contest/134/J来源:牛客网 题目描述 铁子最近犯上了强迫症,他总是想要把一个序列里的元素变得两两不同,而他每次可以执行一个这 ...
- 牛客小白月赛4 B 博弈论 思维 字符串
链接:https://www.nowcoder.com/acm/contest/134/B来源:牛客网 题目描述 铁子和顺溜在学习了博弈论的sg函数之后,解决了很多很多博弈题,现在他们遇到了一道难题. ...
- 牛客小白月赛19 E 「火」烈火燎原 (思维,树)
牛客小白月赛19 E 「火」烈火燎原 (思维,树) 链接:https://ac.nowcoder.com/acm/contest/2272/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空 ...
- 树的最长链-POJ 1985 树的直径(最长链)+牛客小白月赛6-桃花
求树直径的方法在此转载一下大佬们的分析: 可以随便选择一个点开始进行bfs或者dfs,从而找到离该点最远的那个点(可以证明,离树上任意一点最远的点一定是树的某条直径的两端点之一:树的直径:树上的最长简 ...
- 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...
- 牛客小白月赛8 - E - 诡异数字 数位DP
牛客小白月赛8 - E - 诡异数字 题意: 求区间中,满足限制条件的数字的个数. 限制条件就是某些数字不能连续出现几次. 思路: 比较裸的数位DP, DP数组开一个dp[len][x][cnt] 表 ...
- 牛客小白月赛18 Forsaken给学生分组
牛客小白月赛18 Forsaken给学生分组 Forsaken给学生分组 链接:https://ac.nowcoder.com/acm/contest/1221/C来源:牛客网 Forsaken有 ...
- 牛客小白月赛18 Forsaken喜欢数论
牛客小白月赛18 Forsaken喜欢数论 题目传送门直接点标题 Forsaken有一个有趣的数论函数.对于任意一个数xxx,f(x)f(x)f(x)会返回xxx的最小质因子.如果这个数没有最小质 ...
- 【牛客小白月赛21】NC201604 Audio
[牛客小白月赛21]NC201604 Audio 题目链接 题目大意: 给出三点 ,求到三点距离相等的点 的坐标. 解析 考点:计算几何基础. 初中蒟蒻表示不会什么法向量.高斯消元..qwq 方法一: ...
随机推荐
- .Net Core DevOps -免费用Azure四步实现自动化发布(CI/CD)
前言 linux 大行其道的今天想必大家都已经拥抱 core 了吧,通常的方案都是 gitlab+jenkins+centos,但是这样的方案不适合我这种懒人,一直在寻求简单的解决方案,在寻求方案的过 ...
- CTF杂项题解题思路
下载压缩包解压 如果是图片就先查看图片信息 没有有用信息查看图片看是否是一个图片 如果不是图片就将文件进行还原 从还原文件中查找有用信息 例:这是一张单纯的图片 http://123.206.87.2 ...
- C++ protobuffer 前后端通信 简单应用
后端发送多个protobuffer消息到前端,前端用socket监听,如何区分消息类型呢? //定义心跳包 DseHeartbeat _DseHeartbeat; DseHeartbeat _DseH ...
- 五、Python基础(2)
五,Python基础(2) 1.数据类型基础 (一)什么是数据类型? 用于区分变量值的不同类型. (二)为何对数据分类? 针对不同状态就应该用不同类型的数据去标识. (三)数据类型分类 1.数字类型 ...
- 深入理解JVM-java字节码文件结构剖析(1)
public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { ...
- asp.net core系列 69 Amazon S3 资源文件上传示例
一. 上传示例 Install-Package AWSSDK.S3 -Version 3.3.104.10 using Amazon; using Amazon.Runtime; using Ama ...
- 从原理层面掌握@RequestAttribute、@SessionAttribute的使用【一起学Spring MVC】
每篇一句 改我们就改得:取其精华,去其糟粕.否则木有意义 前言 如果说知道@SessionAttributes这个注解的人已经很少了,那么不需要统计我就可以确定的说:知道@RequestAttribu ...
- Python 四大主流 Web 编程框架
Python 四大主流 Web 编程框架 目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架 ...
- 0x33 同余
目录 定义 同余类与剩余系 费马小定理 欧拉定理 证明: 欧拉定理的推论 证明: 应用: 定义 若整数 $a$ 和整数 $b$ 除以正整数 $m$ 的余数相等,则称 $a,b$ 模 $m$ 同余,记为 ...
- Java连载14-补码简介&浮点型整数
一.补码简介 1.计算机中的符号数有三种表示方式,即为:原码.反码.补码.三种表示方法均有符号位和数值位,符号位都是0表示正数,符号位都是1表示负数. 2.计算机中的数字的存储方式:在计算机系统中,数 ...