I♥TLE

Java、オンラインジャッジなど

0021-Parallelism

問題(外部リンク)

Parallelism | Aizu Online Judge

実装の概要

2直線の平行を判定するAPIが標準では備わっていないので自力実装を行います。(2線分の交差判定であれば存在します)
2直線が平行ということはそれぞれの傾きが等しいということなので、入力された座標から傾きを求めて比較します。
ただし、片方でもy軸と平行な場合はそもそも傾きを求めることができないので別枠で処理を行います。
注意点として、今回の問題は座標をfloatで処理しないとACになりません。傾きの計算を積の形に変えたり、更にはdouble型をBigDecimalに変更したりと色々試しましたが、誤差を少なくすればいいという問題ではないようです。(現に、ACとなった実装でも入力が端から端までのような場合だと少しy座標をずらしたものでもYESとなる例があります)
これから挑戦する方は上記の点に気をつけてください。

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());

		for(int i = 0; i < n; i++){
			String tmp = br.readLine();

			if(tmp == null){
				break;
			}
			String[] tmpArray = tmp.split(" ");

			float [][] fpoints = new float[4][2];
			for(int j = 0; j < fpoints.length ;j++){
				fpoints[j][0] = Float.parseFloat(tmpArray[j*2]);
				fpoints[j][1] = Float.parseFloat(tmpArray[j*2+1]);
			}

			//一方の直線がy軸と平行だった場合
			if((fpoints[1][0]==(fpoints[0][0])) || (fpoints[3][0]==( fpoints[2][0])) ){
				//どちらもy軸と平行ならYES
				if((fpoints[1][0]==(fpoints[0][0])) && (fpoints[3][0]==( fpoints[2][0])) ){
					System.out.println("YES");
				}
				else {
					System.out.println("NO");
				}
			}

			else if((fpoints[1][1]-fpoints[0][1])/(fpoints[1][0]-fpoints[0][0])
					== (fpoints[3][1]-fpoints[2][1])/(fpoints[3][0]-fpoints[2][0])){
				System.out.println("YES");
			}
			else{
				System.out.println("NO");
			}
		}
	}

}