计蒜客/阿里的新游戏
2018-03-03 20:14
204 查看
阿里九游开放平台近日上架了一款新的益智类游戏——成三棋。成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示:
成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子。我们可以用坐标系来描述棋盘:
如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三。现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的。请你帮小红计算他成三的线段数。
样例对应的棋盘如下:
输入格式
输入第一行两个整数 n,m(3 \le n, m \le 9)n,m(3≤n,m≤9),nn 表示小红的棋子数,mm 表示小明的棋子数。
接下来 nn 行输入小红的棋子坐标。
接下来 mm 行输入小明的棋子坐标。
输入保证坐标合法,并且棋子之间不重合。
输出格式
输出小红成三的线段数。
样例输入
6 3
-1 0
-2 0
-3 0
-1 -1
-1 1
1 0
0 2
0 3
2 2
样例输出
2
我的思路比较简单,先把输入的数据存放在二维数组a[10][2]里,然后分别以行、列的方式遍历该数组,对该数组中横、纵坐标相同的点进行分类,-3到3的7个数字,num[7]对在每一条纵线和横线上的点进行统计,从而知道每一个线段方向上有几个点,b[7][6]则是记录横坐标或者纵坐标相同的点记录另一维的数字,以便之后判断是否在一条线段上。
在judge函数里,如果一个线段方向上有超过3个点,若这个数字不是0,那么肯定只有三个点,而且这三个点在一条线段上(从图里可以看出)。如果这个数字是0,可以对b[i][]里存的数字进行排序,先从小到大,如果前三个数字分别是-3,-2,-1,那么肯定符合要求,再从大到小排序,如果前三个数字分别是3,2,1,也是符合要求的。之所以进行两次排序判断,是因为可能有6个点,在两条线段上。
代码如下:
成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子。我们可以用坐标系来描述棋盘:
如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三。现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的。请你帮小红计算他成三的线段数。
样例对应的棋盘如下:
输入格式
输入第一行两个整数 n,m(3 \le n, m \le 9)n,m(3≤n,m≤9),nn 表示小红的棋子数,mm 表示小明的棋子数。
接下来 nn 行输入小红的棋子坐标。
接下来 mm 行输入小明的棋子坐标。
输入保证坐标合法,并且棋子之间不重合。
输出格式
输出小红成三的线段数。
样例输入
6 3
-1 0
-2 0
-3 0
-1 -1
-1 1
1 0
0 2
0 3
2 2
样例输出
2
我的思路比较简单,先把输入的数据存放在二维数组a[10][2]里,然后分别以行、列的方式遍历该数组,对该数组中横、纵坐标相同的点进行分类,-3到3的7个数字,num[7]对在每一条纵线和横线上的点进行统计,从而知道每一个线段方向上有几个点,b[7][6]则是记录横坐标或者纵坐标相同的点记录另一维的数字,以便之后判断是否在一条线段上。
在judge函数里,如果一个线段方向上有超过3个点,若这个数字不是0,那么肯定只有三个点,而且这三个点在一条线段上(从图里可以看出)。如果这个数字是0,可以对b[i][]里存的数字进行排序,先从小到大,如果前三个数字分别是-3,-2,-1,那么肯定符合要求,再从大到小排序,如果前三个数字分别是3,2,1,也是符合要求的。之所以进行两次排序判断,是因为可能有6个点,在两条线段上。
代码如下:
#include <iostream> #include <algorithm> using namespace std; int Point_num,useless,a[10][2]={-99},b[7][6]={-99},so=0; int num[7]={0}; void judge() { int *p,i; for(i=0;i<7;i++) { if(num[i]>2) { p=b[i]; if(i!=3) so++; else { sort(p,p+num[i],less<int>()); if(p[0]==-3 && p[1]==-2 &&p[2]==-1) so++; sort(p,p+num[i],greater<int>()); if(p[0]==3 && p[1]==2 &&p[2]==1) so++; } } } } void d(int c) { int i,j; for(i=0;i<7;i++) { num[i]=0; for(j=0;j<6;j++) b[i][j]=-99; } for(i=0;i<Point_num;i++) { j=a[i][c]+3; b[j][num[j]++]=a[i][1-c]; } } int main(){ int i,j,k; cin>>Point_num>>useless; for(i=0;i<Point_num;i++) cin>>a[i][0]>>a[i][1]; for(i=0;i<useless;i++) cin>>j>>k; for(i=0;i<2;i++) { d(i); judge(); } cout<<so; }
相关文章推荐
- 计蒜客 15499 阿里的新游戏 题解
- 计蒜客第18题---跳跃游戏
- [面经]阿里游戏一面的算法题
- 计蒜客-跳跃游戏二
- 计蒜客 18题 跳跃游戏
- 计蒜之道(阿里的新游戏)第一题 解题报告
- 计蒜客---跳跃游戏
- 可能是最鸡汤的面经(百度,阿里,腾讯,网易游戏等)
- 计蒜客 第18题:跳跃游戏
- 计蒜客-跳跃游戏二(dp)
- 阿里一道抽奖游戏算法题水解。
- 阿里大文娱宣布成立游戏事业群;茅台瘦身停产155个品牌;苹果iPhone 8硬件成本曝光丨价值早报
- 腾讯反击:我教阿里做游戏,请阿里教我做公关!
- 计蒜客 阿里天池的新任务(简单)KMP轻松水过
- 阿里游戏大数据sesson2_RF&GBRT(上)
- 计蒜客————跳跃游戏二
- 计蒜客 跳跃游戏
- 计蒜客 难题题库 207 传球游戏
- 面试-----211小本的求职之路拿到腾讯阿里人人网易游戏offer
- 首期寄语 | 阿里游戏云马全治:伟大的改变,从“听说”开始