题干:

五子棋是一个简单的双人游戏。

小希最近在思索一种更好玩的五子棋。她希望胜利不再是谁先五子连珠谁赢,而变成谁落子后,该子与之前的子五子连珠的次数更多才能胜利。

但是如果是在普通的棋盘上,这个游戏又显得不是很有趣,所以她将棋盘扩大至N*N,因为棋盘过大,没有一个程序能将其展示出来,所以如何落子只能凭借记忆。

她希望你能写一个程序,判断每步落子与之前的同色棋子是否能形成五子连珠。

五子连珠是指是横着竖着或者斜着的八个方向存在连续的颜色相同的至少五个子。

注意:这个版本的五子棋仍然是双人游戏,先手执黑,后手执白。同色才是五子棋。

输入描述:

第一行一个正整数N,M,表示棋盘大小和落子次数。
随后M行,每行两个整数xixi,yiyi,表示落子位置。N,M≤300,000N,M≤300,000
1≤xi,yi≤N1≤xi,yi≤N数据保证同一个子的位置不会多次落子。

输出描述:

对于每一个子,一行,如果该步落下后,该子和其他子能形成五子连珠,输出一个大写的'Y',否则输出一个大写的'N'。

示例1

输入

复制

6 12
1 1
6 1
2 2
5 2
3 3
4 3
4 4
3 4
5 5
2 5
6 6
1 6

输出

复制

N
N
N
N
N
N
N
N
Y
Y
Y
Y

解题报告:

这题卡常数太狠了啊、、、set判断边界是否出现过,,,随便怎么写来标记这个二维坐标,都可以。(如果这个棋盘说了n*m<1e6,,甚至可以用二维vector,但是这里是n*n,就没治了)

AC代码1:

#include<bits/stdc++.h>
using namespace std;
struct Node {int x, y;Node(int x, int y) : x(x), y(y) {}bool operator < (const Node& node) const {return x < node.x || (x == node.x && y < node.y);}
};
int n, m;
set<Node> st[2];
const int dx[] = {0, 1, 1, 1};
const int dy[] = {1, 0, 1, -1};
bool judge(int x, int y, int c) {for(int k = 0; k < 4; k++) {int cnt = 1;for(int i = 1; i <= 4; i++) {Node tmp(x+i*dx[k], y+i*dy[k]);if(st[c].find(tmp) == st[c].end())break;cnt++;}for(int i = 1; i <= 4; i++) {Node tmp(x-i*dx[k], y-i*dy[k]);if(st[c].find(tmp) == st[c].end())break;cnt++;}if(cnt >= 5) return true;}return false;
}
int main() {cin>>n>>m;for(int i = 0; i < m; i++) {int x, y; scanf("%d%d",&x,&y);st[i&1].insert(Node(x, y));puts(judge(x, y, i&1) ? "Y" : "N");}return 0;
}

AC标程:(但是因为数据问题,这题不加判边界这一句,也可以AC)

#include <bits/stdc++.h>
using namespace std;const int mn = 3e5 + 5;const int dx[] = {1, 1, 0, -1, -1, -1, 0, 1};
const int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};int n;
unordered_map<int, bool> h[mn];inline bool inbound(int x, int y) {return x <= n && x >= 1 && y <= n && y >= 1;
}inline bool getColor(int x, int y) { return h[x][y]; }inline int getNumberByWay(int k, int x, int y) {int s = 1;while (s <= 5) {int ux = x + dx[k] * s, uy = y + dy[k] * s;if (!inbound(x, y) || !h[ux].count(uy) ||getColor(x, y) != getColor(ux, uy))return s - 1;s++;}return s;
}inline bool win(int x, int y, bool color) {h[x][y] = color;for (int i = 0; i < 4; i++) {if (getNumberByWay(i, x, y) + getNumberByWay(i + 4, x, y) + 1 >= 5)return 1;}return 0;
}int m;int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= m; i++) {int x, y;scanf("%d%d", &x, &y);if (win(x, y, i % 2))puts("Y");elseputs("N");}
}

AC代码2:(Hash版本)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int ha[10000007]={0};
int n,m,x,y;
const ll mod = 9989783;
ll seed = 3e5 + 7;
inline int read(){int x = 0;char c = getchar();while(c<'0'||c>'9') c = getchar();while(c>='0'&&c<='9'){x = x*10 + c-'0';c = getchar();}return x;
}
inline int gethash(ll x,ll y){int t = (x*seed + y)%mod;return t;
}
int find(int x,int y,int dx,int dy,int p,int d){if(d>=4) return d;if(x>=1&&x<=n&&y>=1&&y<=n&&ha[gethash(x,y)] == p) return find(x+dx,y+dy,dx,dy,p,d+1);return d;
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=m;++i){x = read();y = read();ha[gethash(x,y)] = i%2 + 1;if(find(x-1,y-1,-1,-1,i%2 + 1,0) + find(x+1,y+1,1,1,i%2 + 1,0)>=4|| find(x-1,y+1,-1,1,i%2 + 1,0) + find(x+1,y-1,1,-1,i%2 + 1,0)>=4|| find(x-1,y,-1,0,i%2 + 1,0) + find(x+1,y,1,0,i%2 + 1,0)>=4|| find(x,y-1,0,-1,i%2 + 1,0) + find(x,y+1,0,1,i%2 + 1,0)>=4) printf("Y\n");else printf("N\n");}
}

AC代码3:(900ms)

#include<bits/stdc++.h>
using namespace std;
struct Node {int x, y;Node(int x, int y) : x(x), y(y) {}bool operator < (const Node& node) const {return x < node.x || (x == node.x && y < node.y);}
};
int n, m;
set<Node> st[2];
const int dx[] = {0, 1, 1, 1};
const int dy[] = {1, 0, 1, -1};
bool judge(int x, int y, int c) {for(int k = 0; k < 4; k++) {int cnt = 1;for(int i = 1; i <= 4; i++) {Node tmp(x+i*dx[k], y+i*dy[k]);if(st[c].find(tmp) == st[c].end())break;cnt++;}for(int i = 1; i <= 4; i++) {Node tmp(x-i*dx[k], y-i*dy[k]);if(st[c].find(tmp) == st[c].end())break;cnt++;}if(cnt >= 5) return true;}return false;
}
int main() {cin>>n>>m;for(int i = 0; i < m; i++) {int x, y; scanf("%d%d",&x,&y);st[i&1].insert(Node(x, y));puts(judge(x, y, i&1) ? "Y" : "N");}return 0;
}

但是这套代码你要是judge函数这么写就必须用个Hash来写,不然就会T,,不知道为啥。(1600ms左右)

虽然判边界没用但是这题还是有点用的,,因为要看mp是否越界、、但是上面那个代码不加这个判断边界这个函数也可以AC,,我感觉就是因为方向的顺序问题吧、

#include<bits/stdc++.h>
using namespace std;
struct Node {int x, y;Node(int x, int y) : x(x), y(y) {}bool operator < (const Node& node) const {return x < node.x || (x == node.x && y < node.y);}
};
int n, m;
set<Node> st[2];
unordered_map<int , bool > mp[300005];
const int dx[] = {0, 1, 1, 1};
const int dy[] = {1, 0, 1, -1};
inline bool inbound(int x, int y) {return x <= n && x >= 1 && y <= n && y >= 1;
}
bool judge(int x, int y, int c) {for(int k = 0; k < 4; k++) {int cnt = 0;for(int i = -4; i <= 4; i++) {int tx = x+i*dx[k];int ty = y+i*dy[k];if(!inbound(tx,ty) || !mp[tx].count(ty) || mp[tx][ty] != mp[x][y]) {cnt = 0;continue;}if(++cnt >= 5) return true;}}return false;}
int main() {cin>>n>>m;for(int i = 0; i < m; i++) {int x, y;scanf("%d%d",&x,&y);mp[x][y]=i%2;//puts(judge(x, y, i%2) ? "Y" : "N");}return 0;
}

【牛客 - 331B】炫酷五子棋(STLset 或Hash,tricks,二维map标记)相关推荐

  1. 【牛客NOIP模拟】 牛牛的RPG游戏【二维偏序】【任意坐标斜率优化】【CDQ 分治】【李超线段树】

    题意: n×mn\times mn×m 的网格图,每个点有两个权值 vali,j,bufi,jval_{i,j},buf_{i,j}vali,j​,bufi,j​,从 (1,1)(1,1)(1,1) ...

  2. 牛客练习赛59 小松鼠吃松果(优化dp二维偏序)

    小松鼠吃松果 非常nicenicenice的一道题 首先考虑dpdpdp 容易想到按照时间来排序 然后定义dp[i]dp[i]dp[i]为考虑前iii个果子且吃掉第iii个的最大价值 那么每次都去前面 ...

  3. 100天精通Python(可视化篇)——第82天:matplotlib绘制不同种类炫酷散点图参数说明+代码实战(二维散点图、三维散点图、散点图矩阵)

    文章目录 专栏导读 0. 前言 1. 参数说明 2. 两主特征:二维散点图 1)普通散点图 2)文字标签散点图 3)带颜色映射的散点图 4)ArcGIS散点图 5)

  4. 牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案

    牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案 题目描述 给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST). 题解: 二叉搜索树的定义: 二叉搜索树或者是一棵空树,或者是具有下 ...

  5. 微信公众号客服系统怎么生成能追踪效果的二维码?

    想要做好微信公众号的运营,专业的技能少不了,但是也要具有善于使用工具的能力,正所谓"工欲善其事必先利其器",一款好的客服系统,不但可以方便我们进行客户接待,还能帮助我们生分析公众号 ...

  6. 牛客网(剑指offer) 第二十二题 从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. <?php/*class TreeNode{var $val;var $left = NULL;var $right = NUL ...

  7. 牛客网(剑指offer) 第十二题 数值的整数次方

    //题目描述 //给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. <?phpfunction Power($base, $expo ...

  8. 2021牛客暑期多校训练营1 H Hash Function FFT\NTT

    传送门 文章目录 题意: 思路: 题意: 给你一个数组aaa,你需要找一个最小的模数xxx,使得aaa中每个数都模上xxx之后互不相同. n≤5e5,ai≤5e5,ai!=ajn\le5e5,a_i\ ...

  9. *【牛客 1 - A】矩阵(字符串hash)

    题干: 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每行 ...

最新文章

  1. 单元测试 Mocking 类库需具备的特性
  2. 正则表达式贪婪模式及最短匹配
  3. 认识Linux设备驱动模型和Kobject
  4. 从0开始搭建ELK及采集日志的简单应用
  5. SAP Analytics Cloud的Sample Story
  6. iOS UI基础-7.0 UIScrollView
  7. DataReader不奇怪,该出手时就出手!
  8. 好奇怪呀后面加什么标点_狗狗吃饭时奇怪的小动作,你知道代表什么吗?做个懂狗的好主人...
  9. XML DTD用法【转载】
  10. Revit 2011 二次开发之Ribbon
  11. mybatis框架搭建学习初步
  12. tensorflow--制作数据集tfrecords文件
  13. vensim逆向供应链仿真
  14. 网页鼠标点击特效案例收集
  15. 宇宙最强API接口调试工具Apipost
  16. php邮箱必填,discuz关闭邮箱注册必填选项
  17. VM8无intnet访问权限
  18. 用matlab画树叶,matlab画漂亮的树叶
  19. 《网络攻防》 免杀原理与实践
  20. 直击GITC2018 尚德机构苏万松:从消费互联网到产业互联网

热门文章

  1. [Bugku][Crypto][CTF][2020]Crypto 1-20 write up
  2. 【数据结构与算法】图
  3. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第7篇]随机性如何辅助计算和什么是BPP类问题
  4. 混合代码块 Markdown Leedcde
  5. drive es 软件兼容_某知名软件被完美修改!对不住了!
  6. 福师2018计算机应用基础,中石油华东《计算机应用基础》2018年秋学期在线作业100分答案满分...
  7. java语言中的标识符_Java语言基本语法(一)————关键字标识符(Java语言标识符命名规范Java语言的包名、类名、接口名、变量名、函数名、常量名命名规则 )...
  8. Qt 编码问题QTextCodec
  9. java中domain什么意思_java解析URL中domain、端口和协议的两种方法
  10. 简单网络聊天程序java_基于Java实现hello/hi简单网络聊天程序