题解 CF21B 【Intersection】
本题需掌握知识:一次函数相关知识、分支结构。
要想考虑全面确实起码绿的难度,再加上 if 不写乱,蓝题也是差不多的罢(个人向)。
考虑各种情况,我们一 一分析:
- 有一个式子三个系数都是0:很显然无论 x,y 取何值,0=0 这个恒等式绝对成立,那么这个式子是覆盖整个坐标系的,肯定有无限个点重合,
-1
石锤。 - 有一个式子 a,b 两系数为0,c不为0:很显然这个式子无解,所以绝对没有重合,
0
石锤。 - 在上述均不满足的条件下,有一个式子 b 系数为0:此时该直线平行于 y 轴,另一条直线一定会与它相交。
- 在两个式子的 b 均为0的情况下:
- 有一个式子 a 为0 但c不为0,同2.所述。
- 两个式子 c都为0 或 a都为0 或 a,c 成比例关系,说明两直线重合,输出
-1
。 - 剩余情况肯定平行或无解,
0
石锤。
- 在上述均不满足且a,b成比例关系时:
- 如果 b,c 也成比例关系,说明两直线重合,
-1
走人。 - 肯定平行。
- 如果 b,c 也成比例关系,说明两直线重合,
- 肯定相交。
心态差点炸了
注意:因为涉及到除法运算,建议使用float
或double
类型存储六个数据。
#include<bits/stdc++.h>
using namespace std;
double a1,b1,c1,a2,b2,c2;
int solve() {
if(b1||b2) {
if((!a1&&!b1&&!c1)||(!a2&&!b2&&!c2)) return -1;
if((!a1&&!b1)||(!a2&&!b2)) return 0;
if(!b1||!b2) return 1;
} else {
if((!a1&&c1)||(!a2&&c2)) return 0;
if(!(c2||c1)||!(a2||a1)||a1/c1==a2/c2) return -1;
return 0;
}
if(a1/b1==a2/b2) {
if(c1/b1==c2/b2) return -1;
return 0;
}
return 1;
}
int main() {
cin>>a1>>b1>>c1>>a2>>b2>>c2;
cout<<solve();
return 0;
}
代码还是很短的,但是调好有点难。
另:可以使用desmos帮助理解。
任何一个伟大的计划,都有一个微不足道的开始