AOJ 796.数三角形

Time Limit: 5000 ms   Case Time Limit: 5000 ms   Memory Limit: 128 MB
Total Submission: 112   Submission Accepted: 40
 
Description
ACMer最讨厌大段大段的题目描述了,尤其当题目描述是英文的时候。还好,1243France为大家准备了一道简洁且简单的问题。
给出平面上n个点的坐标,求这n个点总共可以围成多少个面积大于0的三角形。
保证每个点的横纵坐标均为整数且绝对值小于等于100。
保证给出点当中没有重点
Input
输入数据包含多组,EOF结束
每组数据第一行包含一个数n,表示有n个点(1 ≤ n ≤ 200)
之后n行每行两个整数x,y表示一个点和横坐标及纵坐标(- 100 ≤ x,y≤ 100)
Output
对于每组输入,输出一个数k
表示总共能围成k个面积大于0的三角形
Sample Input
Original Transformed
4
0 0
1 1
2 0
2 2
1
1 1
Sample Output
Original Transformed
3
0

只需要保证不存在三个点在一条直线即可

(包括横坐标相同、纵坐标相同、斜率相同)

(貌似我写的没有考虑到斜率不存在的情况欸~不过AC了)

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <string>
 6 #include <iostream>
 7 #include <vector>
 8 #include <list>
 9 #include <stack>
10 using namespace std;
11  
12 #define REP(n) for(int o=0;o<n;o++)
13  
14 pair<int,int> p[205];
15 bool Do() {
16     int n;
17     if(scanf("%d",&n) == EOF)
18         return false;
19     REP(n) {
20         int x,y;
21         scanf("%d%d",&x,&y);
22         p[o] = pair<int,int>(x,y);
23     }
24     int cnt = 0;
25     for(int i = 0;i < n;i++)
26         for(int j = i + 1;j < n;j++)
27             for(int k = j + 1;k < n;k++) {
28                 if(i < j&&j < k) {
29                     pair<int,int >a = p[i],b = p[j],c = p[k];
30                     if(!(
31                         (a.first == b.first&&a.first == c.first) ||
32                         (a.second == b.second&&a.second == c.second) ||
33                         ((double)(a.first - b.first) / (double)(a.second - b.second) ==
34                             (double)(c.first - b.first) / (double)(c.second - b.second))
35                         )) {
36                         cnt++;
37                         //printf("%d %d %d
",i,j,k);
38                     }
39                 }
40             }
41     printf("%d
",cnt);
42  
43     return true;
44 }
45  
46 int main() {
47     while(Do());
48     return 0;
49 }
原文地址:https://www.cnblogs.com/ohyee/p/5313754.html