Smiling & Weeping
----相同的夜让相同的树林泛白。彼时,我们也不再相似如初。
题目链接:P1355 神秘大三角 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目:
# 神秘大三角
## 题目描述
判断一个点与已知三角形的位置关系。
## 输入格式
前三行,每行一个坐标,表示该三角形的三个顶点。
第四行,一个点的坐标,试判断该点与前三个点围成三角形的位置关系。
所有坐标值均为整数。
## 输出格式
- 若点在三角形内(不含边界),输出 $1$;
- 若点在三角形外(不含边界),输出 $2$;
- 若点在三角形边界上(不含顶点),输出 $3$;
- 若点在三角形顶点上,输出 $4$。
## 样例 #1
### 样例输入 #1
```
(0,0)
(3,0)
(0,3)
(1,1)
```
### 样例输出 #1
```
1
```
## 提示
### 数据规模与约定
对于 $100\%$ 数据,$0\le x_i,y_i\le 100$。
思路:利用叉积判断p点与三条边的关系
--如果p在三条边的右边或左边,在三角形内
--如果p在一或两条边的左边、右边,另外的边在相反的位置,在三角形外
--如果left+right==1,仅位于一条边的左右,在两条边的交点上
--其他:在边上
Talk is cheap , show me the code
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct Point{ 4 int x,y; 5 Point(){} 6 Point (int x , int y):x(x),y(y){} 7 Point operator + (Point B) {return Point(x+B.x,y+B.y); } 8 Point operator - (Point B) {return Point(x-B.x,y-B.y); } 9 }pp[3],p; 10 typedef Point Vector; 11 double Cross(Vector a , Vector b){ 12 return a.x*b.y - a.y*b.x; 13 } 14 int main() 15 { 16 int left=0,right=0; 17 for(int i = 0; i < 3; i++) scanf(" (%d,%d)",&pp[i].x,&pp[i].y); 18 scanf(" (%d,%d)",&p.x,&p.y); 19 // 这个读入是真的玄幻 20 for(int i = 0; i < 3; i++){ 21 int c = Cross(p-pp[i] , p-pp[(i+1)%3]); 22 if(c>0) right++; 23 if(c<0) left++; 24 } 25 if(right == 3 || left == 3) printf("1"); 26 else if(left > 0 && right > 0) printf("2"); 27 else if(left+right == 1) printf("4"); 28 else 29 printf("3"); 30 return 0; 31 }
注意读入要把换行抵消,而且不能getchar()
[○・`Д´・ ○]
让时光搁浅一会儿
听风声 看日落
我们下次再见
标签:神秘,pp,right,Point,int,三角,##,三角形,P1355 From: https://www.cnblogs.com/smiling-weeping-zhr/p/17631604.html