``How am I ever going to solve this problem?" said the pilot.
Indeed, the pilot was not facing an easy task. She had to drop packages at specific points scattered in a dangerous area. Furthermore, the pilot could only fly over the area once in a straight line, and she had to fly over as many points as possible. All points were given by means of integer coordinates in a two-dimensional space. The pilot wanted to know the largest number of points from the given set that all lie on one line. Can you write a program that calculates this number?
Your program has to be efficient!
The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.
The input consists of N pairs of integers, where 1 < N < 700. Each pair of integers is separated by one blank and ended by a new-line character. The list of pairs is ended with an end-of-file character. No pair will occur twice.
For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.
The output consists of one integer representing the largest number of points that all lie on one line.
1
1 1
2 2
3 3
9 10
10 11
3
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;


public class Problem270
{


/** *//**
* @param args
*/

public static void main(String[] args)
{
int times=0;
ArrayList param = new ArrayList();
ArrayList result = new ArrayList();
int largestNum = 0;
String s=null;

try
{
//get start point
BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ) );
s = cin.readLine();

if(s==null || s.length()<1 || !isNumber(s))
{

if(Integer.parseInt(s)>=700 || Integer.parseInt(s)<=0)
{
System.out.println("error! the start number must between 0 to 700");
return;

}else
{
System.out.println("input a number!!");
}
}
times = Integer.parseInt(s);
//get the space line
cin = new BufferedReader( new InputStreamReader( System.in ) );
s = cin.readLine();

if(s.trim().length()>0)
{
System.out.println("you must enter a space line here!!");
return;
}

for(int i=0; i<times; i++)
{

while(true)
{
cin = new BufferedReader( new InputStreamReader( System.in ) );
s = cin.readLine();

if(s.trim().length()<1)
{
result.add(calculate(param, largestNum));
param = new ArrayList();
largestNum=0;
break;
}

if(isParams(s))
{
param.add(s);
//set largestNum
String[] strs = s.split(" ");

if(largestNum<Integer.parseInt(strs[0]))
{
largestNum=Integer.parseInt(strs[0]);
}

if(largestNum<Integer.parseInt(strs[1]))
{
largestNum=Integer.parseInt(strs[1]);
}

}else
{
System.out.println("error param!");
return;
}
}
}
// //after get params, creat a new array
// int[][] road = initRoad(param, largestNum);
// s = (String) param.get(startpoint-1);
// String[] strs = s.split(" ");
//
// int x = Integer.parseInt(strs[0]);
// int y = Integer.parseInt(strs[1]);
//
// calculate(road, x, y);

for(int i=0; i<times; i++)
{
System.out.println(result.get(i));
System.out.println("");
}

} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}

private static String calculate(ArrayList param, int largestNum)
{
int[][] road = initRoad(param, largestNum);
int tempPointNum=0;
//leftbottom

for(int i=0; i<road.length; i++)
{
int temp = getTempPointNum(0, 0, i, road.length-1, road);

if(temp>tempPointNum)
{
tempPointNum = temp;
}
}
// rightbottom

for(int i=0; i<road.length; i++)
{
int temp = getTempPointNum(0, 0, road.length-1, i, road);

if(temp>tempPointNum)
{
tempPointNum = temp;
}
}
// leftbottom

for(int i=0; i<road.length; i++)
{
int temp = getTempPointNum(road.length-1, road.length-1, i, road.length-1, road);

if(temp>tempPointNum)
{
tempPointNum = temp;
}
}
// rightbottom

for(int i=0; i<road.length; i++)
{
int temp = getTempPointNum(road.length-1, road.length-1, road.length-1, road.length-1, road);

if(temp>tempPointNum)
{
tempPointNum = temp;
}
}
return tempPointNum + "";
}


private static int getTempPointNum(int x1, int y1, int x2, int y2, int[][] road)
{
int result=0;

if(x1==x2)
{

for(int i=y1>y2?y2:y1; i<(y1>y2?y1:y2); i++)
{
if(road[x1][i]==1)
result++;
}
return result;
}
double liner = Math.abs(y1-y2)/Math.abs(x1-x2);

if(liner>=0)
{

if(x1>x2)
{

for(int i=x2; i<=x1; i++)
{
int tempY = (int)((i-x2)*liner + y2);

if(x2==i&&y2==tempY)
{

}else if((y2-tempY)/(x2-i)==liner)
{

}else
{
continue;
}
if(road[i][tempY]==1)
result++;
}

}else
{

for(int i=x1; i<=x2; i++)
{
int tempY = (int)((i-x1)*liner + y1);

if(x1==i&&y1==tempY)
{

}else if((y1-tempY)/(x1-i)==liner)
{

}else
{
continue;
}
if(road[i][tempY]==1)
result++;
}
}
}
return result;
}


private static int[][] initRoad(ArrayList param, int largestNum)
{
// TODO Auto-generated method stub
int[][] result = new int[largestNum][largestNum];
String s=null;
String[] strs;

for(int i=0; i<param.size(); i++)
{
s = (String) param.get(i);
strs = s.split(" ");
result[Integer.parseInt(strs[0])-1][Integer.parseInt(strs[1])-1] = 1;
}
return result;
}


private static boolean isParams(String s)
{
String[] strs = s.split(" ");

if(strs.length!=2)
{
return false;
}

if(isNumber(strs[0]) && isNumber(strs[1]))
{
return true;
}
return false;
}


private static boolean isNumber(String s)
{
boolean result = true;

for(int i=0; i<s.length(); i++)
{

if(s.charAt(i)>='0' && s.charAt(i)<='9')
{
continue;

}else
{
result=false;
break;
}
}
return result;
}

}
