UVA378 Intersecting Lines 题解

这篇具有很好参考价值的文章主要介绍了UVA378 Intersecting Lines 题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

UVA378 Intersecting Lines 题解

怎么这么多点斜式邪教啊。

解法

在计算几何中,我们应该尽可能地避免使用浮点数的计算,尽可能地使用向量计算。

本篇题解默认读者具有向量基础。

为了方便讲解,我们将输入的四个点分别记作 A , B , C , D A,B,C,D A,B,C,D

考虑两条直线 A B , C D AB,CD AB,CD 何时平行。根据向量叉乘的几何意义,如果 A B → × C D → = 0 \overrightarrow{AB} \times \overrightarrow{CD}=0 AB ×CD =0,则两直线平行。

直线重合是在直线平行的基础上,如果 C , D C,D C,D 中任一点在直线 A B AB AB 上,则两直线平行。即 A B → × A C → = 0 \overrightarrow{AB} \times \overrightarrow{AC}=0 AB ×AC =0(这里取点 C C C)。

剩下的情况就是直线相交了。如图,设两直线交点为 E E E

UVA378 Intersecting Lines 题解,题解,c++,算法

根据小学四年级(雾)学的燕尾模型, A E E B = S Δ A D C S Δ B D C \dfrac{AE}{EB}=\dfrac{S_{\Delta ADC}}{S_{\Delta BDC}} EBAE=SΔBDCSΔADC,所以 A E A B = S Δ A D C S Δ A D C + S Δ B D C \dfrac{AE}{AB}=\dfrac{S_{\Delta ADC}}{S_{\Delta ADC}+S_{\Delta BDC}} ABAE=SΔADC+SΔBDCSΔADC,三角形面积可以用叉积轻松求出。

所以两直线交点为 ( X A + ( X B − X A ) × A E A B , Y A + ( Y B − Y A ) × A E A B ) (X_A+(X_B-X_A) \times \dfrac{AE}{AB},Y_A+(Y_B-Y_A) \times \dfrac{AE}{AB}) (XA+(XBXA)×ABAE,YA+(YBYA)×ABAE)

最后提一句,这道题是早期 UVA 题,没有自动忽略文末换行,这题需要有文末换行。文章来源地址https://www.toymoban.com/news/detail-845877.html

代码

#include<bits/stdc++.h>
namespace fast_IO
{
	/**
	 * 省略了一部分
	*/
	inline void read(int &x,char c=Getchar())
	{
		bool f=c!=45;
		x=0;
		while(c<48 or c>57) c=Getchar(),f&=c!=45;
		while(c>=48 and c<=57) x=(x<<3)+(x<<1)+(c^48),c=Getchar();
		x=f?x:-x;
	}
	inline void write(int x)
	{
		if(x<0) Putchar(45),x=-x;
		if(x>=10) write(x/10),x%=10;
		Putchar(x^48);
	}
	inline void read(__int128 &x,char c=Getchar())
	{
		bool f=c!=45;
		x=0;
		while(c<48 or c>57) c=Getchar(),f&=c!=45;
		while(c>=48 and c<=57) x=(x<<3)+(x<<1)+(c^48),c=Getchar();
		x=f?x:-x;
	}
	inline void write(__int128 x)
	{
		if(x<0) Putchar(45),x=-x;
		if(x>=10) write(x/10),x%=10;
		Putchar(x^48);
	}
	inline bool inrange(const char &ch)
	{
		if(ch>=33 && ch<=126) return true;
		return false;
	}
	inline void read(std::string &st,char c=Getchar())
	{
		st.clear();
		while(!inrange(c)) c=Getchar();
		while(inrange(c)) st+=c,c=Getchar();
	}
	inline void write(std::string st)
	{
		for(int i=0;i<st.size();i++) Putchar(st[i]);
	}
	inline void read(char &ch)
	{
		ch=Getchar();
		while(!inrange(ch)) ch=Getchar();
	}
	inline void write(const char &ch)
	{
		Putchar(ch);
	}
	inline void write(double x,int fix=2)
	{
		x+=x>0?my_round[fix+1]:-my_round[fix+1],write((__int128)x),x=x>0?x:-x,x-=(__int128)x;
		if(fix)
		{
			Putchar(46);
			while(fix--) x*=10,Putchar(((int)x)^48),x-=(int)x;
		}
	}
	class fastin
	{
	public:
		template<typename T>
		inline fastin &operator>>(T &x)
		{
			read(x);
			return *this;
		}
	};
	class fastout
	{
	public:
		template<typename T>
		inline fastout &operator<<(T x)
		{
			write(x);
			return *this;
		}
	};
	fastin in;
	fastout out;
};
using namespace fast_IO;
int n;
struct point
{
	int x,y;
	point()
	{
		x=y=0;
	}
	point(int x,int y)
	{
		this->x=x,this->y=y;
	}
	inline point operator-(const point &rhs) const
	{
		return point(x-rhs.x,y-rhs.y);
	}
	inline int operator*(const point &rhs)
	{
		return x*rhs.y-y*rhs.x;
	}
};
inline int sgn(int x)
{
	return x==0?0:(x>0?1:-1);
}
struct seg
{
	point s,t;
};
seg a,b;
inline void calc()
{
	double ix,iy,rat;
	rat=(b.t-a.s)*(b.s-a.s)*1.0/((b.t-a.s)*(b.s-a.s)-(b.t-a.t)*(b.s-a.t));
	ix=a.s.x*1.0+(a.t.x-a.s.x)*rat,iy=a.s.y*1.0+(a.t.y-a.s.y)*rat;
	out<<"POINT "<<ix<<' '<<iy<<'\n';
}
int main()
{
	in>>n,out<<"INTERSECTING LINES OUTPUT\n";
	for(int i=1;i<=n;i++)
	{
		in>>a.s.x>>a.s.y>>a.t.x>>a.t.y>>b.s.x>>b.s.y>>b.t.x>>b.t.y;
		if((a.t-a.s)*(b.t-b.s)==0)
		{
			if((a.t-a.s)*(b.s-a.s)==0) out<<"LINE\n";
			else out<<"NONE\n";
		}else calc();
	}
	out<<"END OF OUTPUT\n";
	fwrite(Ouf,1,p3-Ouf,stdout),fflush(stdout);
	return 0;
}

到了这里,关于UVA378 Intersecting Lines 题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java数据结构与算法刷题-----LeetCode378. 有序矩阵中第 K 小的元素

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 已知矩阵相对有序,可以用二分搜索,不过和一维数组排序不同,这是二维的 每一行都递增,每一列也是递增,所以每

    2024年01月23日
    浏览(51)
  • physical lines & logical lines

    In Python, understanding the difference between physical lines and logical lines is crucial for comprehending the structure of a program. Physical Lines Physical lines refer to the lines you actually see in your text editor. Each of these lines is terminated by a newline character. In other words, every time you hit “Enter” in your code editor, you creat

    2024年02月11日
    浏览(37)
  • 算法题目题单+题解——图论

    本文为自己做的一部分图论题目,作为题单列出,持续更新。 题单由题目链接和题解两部分组成,题解部分提供简洁题意,代码仓库:Kaiser-Yang/OJProblems。 对于同一个一级标题下的题目,题目难度尽可能做到递增。 题目链接:Luogu P3547 [POI2013] CEN-Price List 题解: 题目链接:

    2024年02月19日
    浏览(38)
  • 【算法题解】38. 括号的生成

    这是一道 中等难度 的题 https://leetcode.cn/problems/generate-parentheses/ 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 示例 2: 提示: 1 = n = 8 1 = n = 8 1 = n = 8 分两步操作,先递归生成所有可能的组合,然后判断组合中的每

    2024年02月09日
    浏览(44)
  • 【优先队列】378. 有序矩阵中第 K 小的元素

    初始化最大堆: 创建一个最大堆的优先队列,这使得队列中的元素按照降序排列。 遍历矩阵并更新队列: 通过嵌套的循环遍历二维矩阵中的每一个元素,将元素添加到最大堆中。 控制队列大小: 在添加元素后,检查队列的大小是否已经达到了k。如果已经达到,而且当前遍

    2024年01月22日
    浏览(51)
  • LeetCode 378 有序矩阵中第K小的元素

    LeetoCode地址: . - 力扣(LeetCode) 题解内容大量转载于:. - 力扣(LeetCode) 题意很直观,就是求二维矩阵中所有元素排序后第k小的数。 该写法不再赘述,维护一个大小为k的小顶堆,遍历矩阵所有元素进行入堆操作。 时间复杂度:O(nlogk) 空间复杂度:O(k) 由于矩阵在行和列上都是

    2024年04月12日
    浏览(37)
  • 算法训练第一周题解汇总

    大意:在s1找一个最大的 [l,r] 子区间,使其经过从小到大的排序后 能够变成 s2 题解: 先确定最小的区间,然后慢慢扩大。 最小区间的确定:s1和s2第一个不相等的数开始,到最后一个不相等的数结尾 向两边扩大区间:如果本来就是从小到大排序的,那么就算sort也无影响,

    2024年02月01日
    浏览(38)
  • Leetcode题解-算法-动态规划(python版)

    1.1 爬楼梯 70. 爬楼梯(Easy) 走n阶楼梯的方法有两种,1、先走 1 级台阶,再走 n-1 级台阶;2、先走 2 级台阶,再走 n-2 级台阶 f(n) = f(n-1) + f(n-2) 1.2 强盗抢劫 198. 打家劫舍(Medium) 每个房间财产为 nums[0]……nums[n-1]。 假设 0 至 x 间房获得的最大财产为 f(x)。 f(x) = max(f(x-1),f(x-2)+nums[

    2024年02月03日
    浏览(51)
  • 【LeetCode算法系列题解】第36~40题

    【题目描述】 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次(请参考示例图)。 注意: 一个有效

    2024年02月10日
    浏览(49)
  • 【LeetCode算法系列题解】第61~65题

    【题目描述】 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 【示例1】 【示例2】 【提示】 链表中节点的数目在范围 [0, 500] 内 − 100 ≤ N o d e . v a l ≤ 100 -100le Node.valle 100 − 100 ≤ N o d e . v a l ≤ 100 0 ≤ k ≤ 2 ∗ 1 0 9 0le kle 2 * 10^9 0 ≤ k ≤

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包