2017.04.26
摸金校尉通过激光防范到达指定位置:
package stackAndQueue;
import java.util.Scanner;
class Point{
int x;
int y;
Point(int x, int y){
this.x = x;
this.y = y;
}
}
class Line{
Point start;
Point end;
Line(Point start, Point end){
this.start = start;
this.end = end;
}
}
public class Main {
public static void main(String[] args) {
//读取目标行列数
Scanner sc = new Scanner(System.in);
int m,n;
int count = 0;
m = sc.nextInt();
n = sc.nextInt();
//读取激光数据
Scanner sc1 = new Scanner(System.in);
String info = sc1.nextLine();
String[] points_pos = info.split(" ");
int[] positions = new int[points_pos.length];
for(int i=0;i<points_pos.length;i++){
positions[i] = Integer.parseInt(points_pos[i]);
}
count = positions[0];
int num = 1;
Line[] lines = new Line[count];
for(int i=0;i<count;i++){
Point start = new Point(positions[num++],positions[num++]);
Point end = new Point(positions[num++],positions[num++]);
Line line = new Line(start, end);
lines[i] = line;
}
//如果连接交叉线段,记录上下左右四个方位的最大值,如果上下到顶或者左右到顶即不可到达
for(int i=0;i<lines.length;i++){
int max_x = lines[i].start.x>lines[i].end.x?lines[i].start.x:lines[i].end.x;
int min_x = lines[i].start.x<lines[i].end.x?lines[i].start.x:lines[i].end.x;
int max_y = lines[i].start.y>lines[i].end.y?lines[i].start.y:lines[i].end.y;
int min_y = lines[i].start.y<lines[i].end.y?lines[i].start.y:lines[i].end.y;;
Line line1 = lines[i];
for(int j=0;j<lines.length;j++){
Line line2 = lines[j];
boolean flag = false;
int d = (line1.end.x - line1.start.x)*(line2.end.y-line2.start.y)-(
line1.end.y-line1.start.y)*(line2.end.x-line2.start.x);
if(d!=0){
double r = (line1.start.y-line2.start.y)*(line2.end.x-line2.start.x)-(
line1.start.x-line2.start.x)*(line2.end.y-line2.start.y)/(double)d;
double s = (line1.start.y-line2.start.y)*(line1.end.x-line1.start.x)-(
line1.start.x-line2.start.x)*(line1.end.y-line1.start.y)/(double)d;
if(r>=0 && r<=1 && s>=0 && s<=1){
flag = true;
}
}
//线段相交,进行极值更新
if(flag==true){
int max_x1 = lines[j].start.x>lines[j].end.x?lines[j].start.x:lines[j].end.x;
int min_x1 = lines[j].start.x<lines[j].end.x?lines[j].start.x:lines[j].end.x;
int max_y1 = lines[j].start.y>lines[j].end.y?lines[j].start.y:lines[j].end.y;
int min_y1 = lines[j].start.y<lines[j].end.y?lines[j].start.y:lines[j].end.y;
max_x = max_x>max_x1?max_x:max_x1;
min_x = min_x<min_x1?min_x:min_x1;
max_y = max_y>max_y1?max_y:max_y1;
min_y = min_y<min_y1?min_y:min_y1;
if(max_x>m || min_x<0 || min_y<0 || max_y>n)
{
System.out.println('0');
return;
}
}
}
}
System.out.println('1');
}
}