阿里九游开放平台近日上架了一款新的益智类游戏——成三棋。成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示:
成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子。我们可以用坐标系来描述棋盘:
如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三。现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的。请你帮小红计算他成三的线段数。
样例对应的棋盘如下:
输入格式
输入第一行两个整数 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;
}
转载:https://blog.csdn.net/qq_46423166/article/details/105340550