您的位置:首页 > 其它

2017 计蒜之道 初赛 第一场 阿里的新游戏(找规律,几何,模拟)

2017-05-21 01:40 363 查看
题目:

 34.5%

 1000ms

 131072K

阿里九游开放平台近日上架了一款新的益智类游戏——成三棋。成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示:




成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子。我们可以用坐标系来描述棋盘:





如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三。现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的。请你帮小红计算他成三的线段数。

样例对应的棋盘如下:





输入格式

输入第一行两个整数 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


思路:

题目给的小明的棋子没用,把小红的棋子的坐标都+3,这样更容易建立坐标系

然后根据成三棋的形状,模拟就行

晚上没做出来,思路太局限了,换一个坐标系的建法就可以变得容易了

代码:

#include<cstdio>
#include<cstring>
#include<cctype>
#include<string>
#include<set>
#include<iostream>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
#define mod 10000007
#define debug() puts("what the fuck!!!")
#define N 1111111
#define M 10000020
#define ll longlong
using namespace std;
int map[20][20];
int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
int x, y;
mem(map,0);
for (int i = 0; i < n; ++i)
{
scanf("%d%d", &x, &y);
map[x + 3][y + 3] = 1;
}
for (int i = 0; i < m; ++i)
{
scanf("%d%d", &x, &y);
}
int cnt = 0;
for (int i = 2; i <= 4; ++i) //2-4行 ,
{
for (int j = 0; j <= 6; ++j)
{
if (map[i][j] && map[i][j + 1] && map[i][j + 2])
{
cnt++;
}//竖着看
}
}
for (int i = 2; i <= 4; ++i) //2-4列
{
for (int j = 0; j <= 6; ++j)
{
if (map[j][i] && map[j + 1][i] && map[j + 2][i])
{
cnt++;
} //横着看
}
}
int k = 2, r = 1, c = 1; //竖着看
if (map[r][c] && map[r][c + k] && map[r][c + 2*k])
{
cnt++;
}
r = 5;
if (map[r][c] && map[r][c + k] && map[r][c + 2*k])
{
cnt++;
}
r = 0, k = 3, c = 0;
if (map[r][c] && map[r][c + k] && map[r][c + 2*k])
{
cnt++;
}
r = 6;
if (map[r][c] && map[r][c + k] && map[r][c + 2*k])
{
cnt++;
}
k = 2, c = 1, r = 1; //横着看
if (map[r][c] && map[r + k][c] && map[r + 2*k][c])
{
cnt++;
}
c = 5;
if (map[r][c] && map[r + k][c] && map[r + 2*k][c])
{
cnt++;
}
c = 0, k = 3, r = 0;
if (map[r][c] && map[r + k][c] && map[r + 2*k][c])
{
cnt++;
}
c = 6;
if (map[r][c] && map[r + k][c] && map[r + 2*k][c])
{
cnt++;
}
printf("%d\n", cnt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: