牛客小白月赛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 方法一: ...
随机推荐
- 使用log4net记录ABP日志
demo地址:ABP.WindowsService 该文章是系列文章 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业 的其中一篇. 参考:https://aspnet ...
- 向.Net/Unity 程序员推荐一个十分因吹斯听的网站:sharplab.io
0x00 前言 & 过程 & 结论 今天发现了一个十分有趣的网站: https://sharplab.io/ 网站的页面并不复杂,功能大体上能够在题图中得到概括.发现它的过程也很偶然, ...
- 自定义SWT控件六之自定义Tab
6.自定义tab 本章节提供的自定义tab 分为两类 tab上带删除按钮和添加按钮,可删除tab和添加tab tab不可删除和添加 6.1 不可删除tab package com.view.contr ...
- 阿里云Linxu下的Mysql安装与配置
说明:本文主要详细介绍了关于如何在阿里云ECS服务器上安装并配置Mysql 环境:Centos 7版本,阿里云部署好系统后会默认安装mariadb数据库 1.删除阿里云自带的MariaDB # rpm ...
- WPF 打开网页
1.利用浏览器打开using System.Diagnostics; Process proc = new System.Diagnostics.Process(); proc.StartInfo.F ...
- 02、Java的lambda表达式和JavaScript的箭头函数
前言 在JDK8和ES6的语言发展中,在Java的lambda表达式和JavaScript的箭头函数这两者有着千丝万缕的联系:本次试图通过这篇文章弄懂上面的两个"语法糖". 简介 ...
- 对API进行版本控制的重要性和实现方式
我在API设计中收到的最常见问题之一就是如何对API进行版本控制.虽然并非所有API都完全相同,但我发现在API版本控制方面,某些模式和实践适用于大多数团队.我已经将这些内容收集起来,下面将提供一些关 ...
- java并发编程(五)----(JUC)ReentrantLock
上一节我们了解了Lock接口的一些简单的说明,知道Lock锁的常用形式,那么这节我们正式开始进入JUC锁(java.util.concurrent包下的锁,简称JUC锁).下面我们来看一下Lock最常 ...
- 【POJ - 3616】Milking Time(动态规划)
Milking Time 直接翻译了 Descriptions 贝茜是一个勤劳的牛.事实上,她如此专注于最大化她的生产力,于是她决定安排下一个N(1≤N≤1,000,000)小时(方便地标记为0. ...
- [转载]使用Java操作Mongodb
HelloWorld程序 学习任何程序的第一步,都是编写HelloWorld程序,我们也不例外,看下如何通过Java编写一个HelloWorld的程序. 首先,要通过Java操作Mongodb,必须先 ...