AOJ 796.数三角形
Time Limit: 5000 ms Case Time Limit: 5000 ms Memory Limit: 128 MB
Total Submission: 112 Submission Accepted: 40DescriptionACMer最讨厌大段大段的题目描述了,尤其当题目描述是英文的时候。还好,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\n",i,j,k); 38 } 39 } 40 } 41 printf("%d\n",cnt); 42 43 return true; 44 } 45 46 int main() { 47 while(Do()); 48 return 0; 49 }
然而,我并不能保证我说的是对的。请自行验证,如有错误,请指正
新博客地址
https://www.oyohyee.com
https://www.oyohyee.com