首页 > 其他分享 >P1355 神秘大三角

P1355 神秘大三角

时间:2023-08-15 16:22:06浏览次数:45  
标签:神秘 pp right Point int 三角 ## 三角形 P1355

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

相关文章