阿里的新游戏

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

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

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

样例对应的棋盘如下:

输入格式

输入第一行两个整数 n,m(3 \le n, m \le 9)n,m(3≤n,m≤9),nn 表示小红的棋子数,mm 表示小明的棋子数。

接下来 nn 行输入小红的棋子坐标。

接下来 mm 行输入小明的棋子坐标。

输入保证坐标合法,并且棋子之间不重合。

输出格式

输出小红成三的线段数。

思路:

1,为了便于代码编写,先把中心点(0,0)点移到(4,4)点,相当于把整个棋盘都往右上移动。

2,定义两个数组,一个横轴s[7],一个纵轴ss[7],长度都为7,s[n]代表坐标为n的轴。

   例如出现坐标(3,4),则 s[3]++, ss[4]++。最后s[n]的值即代表横坐标为n的轴上有几个点,ss[n]同理。

3,正常情况下,根据图片可知,s[n]=3,则该轴三点必成线。

4,特殊情况 s[3] 和 ss[3] 会出现特殊情况,因为中间是空点,所以当s[3]=3时,也可能不连续,中心点左边一个,右边两个,

     所以新定义了uy,dy,ux,dx;来保存特殊轴上出现点的位置的情况,当uy等于3即说明三个点全在中心点的上面,从而对特殊情       况进行特殊处理。

代码:

#include<iostream>
using namespace std;
int main()
{
    int a,b,i;
    int x,y;
    int sum=0;
    int xsin=0,ysin=0;
    int s[7]={0},ss[7]={0};
    int uy=0,dy=0,ux=0,dx=0;
    cin>>a>>b;
    for(i=0;i<a+b;i++)
    {
        cin>>x>>y;
        x+=3;
        y+=3;
        if(i<a)
        {
            s[x]++;
            ss[y]++;
        if(x==3)
        {
            if(y<3)
            {
                dy++;
            }
            else
            {
                uy++;
            }
        }
        if(y==3)
        {
            if(x<3)
            {
                dx++;
            }
            else
            {
                ux++;
            }
        }
        }
    }
    for(i=0;i<7;i++)
    {
        if(i!=3)
        {
        if(s[i]==3)
        {
            sum++;
        }
        if(ss[i]==3)
        {
            sum++;
        }
        }
    }
    if(s[3]==4 || s[3]==5 || s[3]==3)
    {
        if(uy==3 || dy==3)
        {
            sum++;
        }
    }
    if(ss[3]==4 || ss[3]==5 || ss[3]==3)
    {
        if(ux==3 || dx==3)
        {
            sum++;
        }
    }
    if(s[3]==6 || ss[3]==6)
    {
        sum+=2;
    }
    cout<<sum;
}

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/105340550
今日推荐