编程题一道

本文介绍了一个基于Java实现的算法,该算法通过输入激光数据来判断摸金校尉是否能够避开激光达到指定位置。具体包括读取目标行列数、激光数据,以及通过计算线段交叉判断可达性的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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');	
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值