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

题目:

  •  34.5%
  •  1000ms
  •  131072K

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

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

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

样例对应的棋盘如下:

输入格式

输入第一行两个整数 n,m(3 \le n, m \le 9)n,m(3n,m9)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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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;
}


你可能感兴趣的:(【思路,模拟,构造】)