您的位置:首页 > 编程语言 > Java开发

计蒜之道(阿里的新游戏)第一题 解题报告

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





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





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

样例对应的棋盘如下:





输入格式

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

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

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

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

输出格式

输出小红成三的线段数。

样例输入

6 3
-1 0
-2 0
-3 0
-1 -1
-1 1
1 0
0 2
0 3
2 2


样例输出

2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;

public class One1 {

public static void main(String[] args)throws IOException {
// TODO Auto-generated method stub
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
line=br.readLine();
String [] strs=line.split(" ");
int n=Integer.parseInt(strs[0]);
int m=Integer.parseInt(strs[1]);

Point [] p=new Point
;
for(int i=0;i<n;++i){
line=br.readLine();
strs=line.split(" ");
p[i]=new Point(Integer.parseInt(strs[0]),Integer.parseInt(strs[1]));
}
for(int i=0;i<m;++i){
br.readLine();
}
int ans=0;
Arrays.sort(p,new Comparator<Point>(){
public int compare(Point p1,Point p2){
if(p1.x<p2.x){
return -1;
}
else if(p1.x>p2.x){
return 1;
}
else{
if(p1.y<p2.y){
return -1;
}
else if(p1.y>p2.y){
return 1;
}
else{
return 0;
}
}
}
});
ans+=yAdd(p);

Arrays.sort(p,new Comparator<Point>(){
public int compare(Point p1,Point p2){
if(p1.y<p2.y){
return -1;
}
else if(p1.y>p2.y){
return 1;
}
else{
if(p1.x<p2.x){
return -1;
}
else if(p1.x>p2.x){
return 1;
}
else{
return 0;
}
}
}
});

ans+=xAdd(p);
System.out.println(ans);
}

public static int xAdd(Point [] p){
int ans=0;
for(int i=2;i<p.length;++i){
if(Math.abs(p[i].y)<=1){
if((p[i].y==p[i-1].y)&&(p[i-1].y==p[i-2].y)){
if((p[i].x-p[i-1].x==1)&&(p[i-1].x-p[i-2].x==1)){
ans++;
}
}
}
else if(Math.abs(p[i].y)==2){
if((p[i].y==p[i-1].y)&&(p[i-1].y==p[i-2].y)){
if((p[i].x-p[i-1].x==2)&&(p[i-1].x-p[i-2].x==2)){
ans++;
}
}
}
else if(Math.abs(p[i].y)==3){
if((p[i].y==p[i-1].y)&&(p[i-1].y==p[i-2].y)){
if((p[i].x-p[i-1].x==3)&&(p[i-1].x-p[i-2].x==3)){
ans++;
}
}
}

}
return ans;
}

public static int yAdd(Point [] p){
int ans=0;
for(int i=2;i<p.length;++i){
if(Math.abs(p[i].x)<=1){
if((p[i].x==p[i-1].x)&&(p[i-1].x==p[i-2].x)){
if((p[i].y-p[i-1].y==1)&&(p[i-1].y-p[i-2].y==1)){
ans++;
}
}
}
else if(Math.abs(p[i].x)==2){
if((p[i].x==p[i-1].x)&&(p[i-1].x==p[i-2].x)){
if((p[i].y-p[i-1].y==2)&&(p[i-1].y-p[i-2].y==2)){
ans++;
}
}
}
else if(Math.abs(p[i].x)==3){
if((p[i].x==p[i-1].x)&&(p[i-1].x==p[i-2].x)){
if((p[i].y-p[i-1].y==3)&&(p[i-1].y-p[i-2].y==3)){
ans++;
}
}
}

}
return ans;
}

}

class Point{
int x;
int y;
Point(int x,int y){
this.x=x;
this.y=y;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 游戏 计蒜之道