题解 一从CSDN博主学来的,每一个题目都写题解
哈哈哈,第一次写题解,真的不知道规范的方式
题目来源:江西理工大学OJ P1007魔兽争霸
题目地址:http://oj.jxust.edu.cn/problems/1007
话不多说,上题目
题目描述
兽兽不仅是ACM大神,还是游戏高手(膜拜),兽兽今天ACM虐爆全场,心情特别嗨,玩上魔兽争霸了,兽兽选择了屠夫这个角色,兽兽毫不客气的对敌方抛出 了钩子(可以看成一条线段),现在给出钩子的起点坐标S(x1,y1)终点坐标T(x2,y2),敌方位置坐标P(x3,y3),要你判定敌方是否被钩 到,即:P在线段ST(包括端点S,T)上为被钩到。
输入
第一行输入一个数字N,表示有N组测试数据,
接下来每组测试数据输入6个整数x1,y1,x2,y2,x3,y3,分别表示S,T,P的坐标(-10000<x1,y1,x2,y2,x3,y3<10000)。
输出
对于每个测试样例,如果被钩到输出“yes”(不包括双引号),否则输出“no”(不包括双引号)。 并且每组输出占一行。
样例输入
3
1 1 2 2 3 3
-1 -1 1 1 0 0
0 0 3 3 2 2
样例输出
no
yes
yes
那就让我们进入题解吧!!!
这个题目,有一说一,就是纯数学嘛,数学想好就好了!
这题目考察三点共线嘛,让我们先回忆一下三点共线的知识点,在二维空间里面(甚至更高维度,我不太清楚,刚上大一萌新),当且仅当三点中任意两点连线的斜率(斜率存在时,这是个错误点)相等时,三点共线。当然了这个题目不仅仅是三点共线就够了,因为要勾到嘛,所以第三个点必须在第一个点和第二点之间,那么这个就要有限制条件,这个限制条件有两种哈,你可以选择x1<=x3<=x2(x2<=x3<=x1)或者y1<=y3<=y2(y2<=y3<=y1),而且这两个选择时括号里外的都是需要的哦!这个题目我居然错了一次,咳咳,不装了
还记得之前说过的错误点嘛,因为在判断斜率相等的时候如果用除法的话,可能会出现除以0的情况(x1=x2),当然了如果用乘法判断斜率应该不会有错,但是我自己习惯用除法了,当时大意了,好吧我承认是我自己太菜了 ,忘记考虑除0的情况,所以WA了一次,哎。*
不吹了,上代码!!
#include <iostream>
using namespace std;
int main()
{
double x1, y1, x2, y2, x3, y3;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
if (x1 != x2)
{
if ((y2 - y1) / (x2 - x1) == (y3 - y2) / (x3 - x2) && (x3 >= x1 && x3 <= x2 || x3 >= x2 && x3 <= x1))
cout << "yes" << endl;
else
cout << "no" << endl;
}
else
{
if(x3==x2&&(y1>=y3&&y3>=y2||y1<=y3&&y2>=y3))
cout << "yes" << endl;
else
cout << "no" << endl;
}
}
return 0;
}
有一说一,我的代码高低有点长,但是让人很容易理解好吧!谁叫我也是个萌新呢
啊!CSDN写博客好爽啊,排版也很好看,代码放上去看起来也很舒服啊,爱了爱了!!!!
谢谢CSDN的一位博主对我的启发!以后我每个题目都要写题解!!!!
加油加油,第一篇题解,高低有一些草率,但是我会做得越来越好的!
谢谢欣赏!!!