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

题干:
 

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

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

但是如果是在普通的棋盘上,这个游戏又显得不是很有趣,所以她将棋盘扩大至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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【牛客 - 318J】王者荣耀(dp,01背包)

题干&#xff1a; "无论何时何地&#xff0c;都会遵守约定"。"奋力逃吧"。"关于取下敌人性命这件事&#xff0c;也从不失约"。 小懒虫zmx平时最喜欢玩的游戏就是《王者荣耀》&#xff0c;在这款游戏中它也最喜欢百里守约这个英雄。最近&#x…

xodo上的笔记不见了_goodnotes 的笔记无缘无故丢失了一本,还能救回来吗?

真的什么都没有做&#xff0c;很普通的记完笔记放在那里去吃饭&#xff0c;回来的时候&#xff0c;别的笔记都没变化&#xff0c;只有我一直在用、刚记完的那一本消失了……我尝试过的方案&#xff1a;1.icloud刚开始不确定那里有没有&#xff0c;我平时是开着 icloud 对笔记的…

【牛客 - 318G】LLLYYY的数字思维 与【牛客 - 289J】这是一个沙雕题II(贪心构造)

题干&#xff1a; LLLYYY很喜欢写暴力模拟贪心思维。某一天在机房&#xff0c;他突然抛给了队友ppq一 个问题。问题如下&#xff1a; 有一个函数f ()&#xff1a; int f(int x){ int tmp 0; while(x ! 0){ tmp x % 10; x / 10; } return tmp; } 接着…

react div组件设置可点击不可点击_React面试全解

更新:收藏前点个赞亲&#xff0c;为啥我每次写的东西收藏都是赞的n倍&#xff01;&#xff01;花了一个月时间总结的React面试题 希望能帮助到你全文近万字建议保存仔细过一遍目录面试中常提的重要概念React生命周期ReduxRouter重要的方法面试中常提的重要概念1 什么是模块化是…

【牛客 - 185B】路径数量(离散数学,长度为k的路径数量,图)

题干&#xff1a; 给出一个 n * n 的邻接矩阵A. A是一个01矩阵 . A[i][j]1表示i号点和j号点之间有长度为1的边直接相连. 求出从 1 号点 到 n 号点长度为k的路径的数目. 输入描述: 第1行两个数n,k (20 ≤n ≤ 30,1 ≤ k ≤ 10) 第2行至第n1行&#xff0c;为一个邻接矩阵 …

php mysql 菜鸟_PHP 和 MySQL 基础教程(四)

PHP 和 MySQL 基础教程(四)发布时间&#xff1a;2016-06-17 来源&#xff1a; 点击:次MySQL 中的 SQL对于 MySQL &#xff0c;第一件你必须牢记的是它的每一行命令都是用分号 (;) 作为结束的&#xff0c;但……没有完全绝对的事&#xff0c;在这儿也是一样。前面我曾经讲到&…

【POJ - 1724 】ROADS (带限制的最短路 或 dfs 或 A*算法,双权值)

题干&#xff1a; N cities named with numbers 1 ... N are connected with one-way roads. Each road has two parameters associated with it : the road length and the toll that needs to be paid for the road (expressed in the number of coins). Bob and Alice use…

mysql 5.7.20 win64_Win10下MySQL5.7.20 Mysql(64位)解压版安装及bug修复

2、解压到某一文件夹&#xff0c;如“C:\Program Files\MySQL\mysql-5.7.20-winx64”3、添加环境变量(系统变量)&#xff1a;变量名&#xff1a;MYSQL_HOME变量值&#xff1a;C:\Program Files\MySQL\mysql-5.7.20-winx64&#xff1b;在系统变量path原有值后添加路径&#xff1…

【CodeForces - 474D】Flowers (线性dp)

题干&#xff1a; We saw the little game Marmot made for Moles lunch. Now its Marmots dinner time and, as we all know, Marmot eats flowers. At every dinner he eats some red and white flowers. Therefore a dinner can be represented as a sequence of several f…

mysql事务顺序重排_MySQL事务处理及字符集和校对顺序

一、事务处理 事务处理&#xff1a;是一种机制&#xff0c;管理必须成批执行的MySQL操作&#xff0c;以保证数据库不包含不完整的操作结果。用来维护数据库的完整性。利用事务处理&#xff0c;可以保证一组操作不会中途停止&#xff0c;或作为整体执行或完全不执行(除非明确指示…

mysql权重怎么配置_mysql如何按权重查询数据啊?

楼上的回答全都会错意了&#xff0c;题主意思是根据权重设定随机几率&#xff0c;例如 A 的权重为10&#xff0c;B 的权重为 5&#xff0c;这个时候随机出现 A 的几率要比出现 B 的几率高。你可以试试这个备选方案。就是先取出权重列表再去根据权重随机出来的那个权重值&#x…

【计蒜客 - 蓝桥训练】修建公路(贪心,或运算,dp)

题干&#xff1a; 蒜头国有 nn 座城市&#xff0c;编号分别为 0,1,2,3,\ldots,n-10,1,2,3,…,n−1。编号为 xx 和 yy 的两座城市之间如果要修高速公路&#xff0c;必须花费 x|yx∣y 个金币&#xff0c;其中|表示二进制按位或。 吝啬的国王想要花最少的价格修建高速公路&#…

【计蒜客 - 蓝桥训练】阶乘位数(数学,对数运算,求阶乘位数)

题干&#xff1a; 蒜头君对阶乘产生了兴趣&#xff0c;他列出了前 1010 个正整数的阶乘以及对应位数的表&#xff1a; nnn!n!位数111221361424251203672037504048403205936288061036288007 对于蒜头君来说&#xff0c;再往后就很难计算了。他试图寻找阶乘位数的规律&#xff…

mysql win10 优化设置_windows10如何优化?系统优化设置方法

windows10如何优化&#xff1f;&#xff0c;高系统效率&#xff0c;尽可能提高运行速度&#xff0c;是我们关心的问题。以下是电脑系统优化设置的4种方法&#xff0c;能够有效的提高系统的使用效率和优化系统管理&#xff0c;我们一起来看看吧&#xff01;第一招&#xff1a;删…

【牛客 - 368D】动态连通块(并查集+bitset优化)

题干&#xff1a; 小T有n个点&#xff0c;每个点可能是黑色的&#xff0c;可能是白色的。 小T对这张图的定义了白连通块和黑连通块&#xff1a; 白连通块&#xff1a;图中一个点集V&#xff0c;若满足所有点都是白点&#xff0c;并且V中任意两点都可以只经过V中的点互相到达&a…

mysql 执行计划extra_mysql执行计划explain type和extra

mysql执行计划&#xff0c;搞定type和extra就能优化大部分sql了。type为主&#xff0c;extra为辅。type&#xff1a;system表只有一行&#xff0c;MyISAM引擎。const常量连接&#xff0c;表最多只有一行匹配&#xff0c;通用用于主键或者唯一索引比较时eq_ref每次与之前的表合并…

【计蒜客 - 蓝桥训练】欧拉函数(数学,数论,模板)

题干&#xff1a; 在数论中&#xff0c;对正整数 nn&#xff0c;欧拉函数 \varphi (n)φ(n) 是小于等于 nn 的正整数中与 nn 互质的数的数目。 例如 \varphi (12)4φ(12)4&#xff0c;因为 1,5,7,111,5,7,11 均和 1212 互质。 代码框中的代码是一种求欧拉函数的实现&#xf…

spark中读取json_【spark】文件读写和JSON数据解析

1.读文件通过 sc.textFile(“file://")方法来读取文件到rdd中。val lines sc.textFile("file://")//文件地址或者HDFS文件路径本地地址"file:///home/hadoop/spark-1.6.0-bin-hadoop2.6/examples/src/main/resources/people.json"HDFS文件地址"…

【牛客 - 370B】Rinne Loves Graph(分层图最短路 或 最短路dp)

题干&#xff1a; Island 发生了一场暴乱&#xff01;现在 Rinne 要和 Setsuna 立马到地上世界去。 众所周知&#xff1a;Island 是有一些奇怪的城镇和道路构成的&#xff08;题目需要&#xff0c;游戏党勿喷&#xff09;&#xff0c;有些城镇之间用双向道路连接起来了&…

设python中有模块m、如果希望同时导入m中的所有成员_python-模块

先做几个练习题练习计算一个四乘四矩阵的所有元素的和&#xff0c;以及对角线之和#encodingutf-8a[[1,2,3,4],[2,5,2,3],[1,5,3,2],[5,3,2,5]]#encodingutf-8a[[1,2,3,4],[2,5,2,3],[1,5,3,2],[5,3,2,5]]total_sum0diagonal_sum0‘‘‘for i in a:print "i:",ifor j …