題目:


給出個n行的三角,每個圓里包含一個字母,問哪些字母能夠組成等邊三角形(每個字母至多出現(xiàn)3次)
解法:
我用了個很懶的方法,算每個圓中心點(diǎn)的坐標(biāo),然后看三點(diǎn)距離是否相等。關(guān)于求坐標(biāo)其實(shí)還是很簡單的- -用向量的方法。
第一行第一個坐標(biāo)設(shè)為(0,0),設(shè)置元向量(-0.5,-0.5*sqrt(3)),然后每一行第一個元素坐標(biāo)就是上行第一個元素坐標(biāo)+元向量,每一行第i個元素坐標(biāo)為第i-1個坐標(biāo)+單位向量。
代碼:
1 //============================================================================
2 // Name : pku1244.cpp
3 // Author : yzhw
4 // Version :
5 // Copyright : yzhw
6 // Description : Hello World in C++, Ansi-style
7 //============================================================================
8
9 #include <iostream>
10 #include <cstdio>
11 #include <cstring>
12 #include <cmath>
13 #include <algorithm>
14 #include <functional>
15 #include <vector>
16 using namespace std;
17 double x=-0.5,y=x*sqrt(3.0);
18 int n;
19 inline double dis(pair<double,double> a,pair<double,double> b)
20 {
21 return (a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second);
22 }
23 inline double equ(double a,double b)
24 {
25 return fabs(a-b)<1e-6;
26 }
27 int main() {
28 double data[20][20][2];
29 while(scanf("%d",&n)&&n)
30 {
31 char str[255];
32 vector<pair<double,double> > map[26];
33 scanf("%s",str);
34 char *p=str;
35 data[0][0][0]=0;
36 data[0][0][1]=0;
37 map[*(p++)-97].push_back(make_pair<double,double>(data[0][0][0],data[0][0][1]));
38 for(int i=1;i<n;i++)
39 {
40 data[i][0][0]=data[i-1][0][0]+x;
41 data[i][0][1]=data[i-1][0][1]+y;
42 map[*(p++)-97].push_back(make_pair<double,double>(data[i][0][0],data[i][0][1]));
43 for(int j=1;j<=i;j++)
44 {
45 data[i][j][0]=data[i][j-1][0]+1;
46 data[i][j][1]=data[i][j-1][1];
47 map[*(p++)-97].push_back(make_pair<double,double>(data[i][j][0],data[i][j][1]));
48 }
49 }
50 bool flag=false;
51 for(int i=0;i<26;i++)
52 if(map[i].size()==3)
53 {
54 if(equ(dis(map[i][0],map[i][1]),dis(map[i][0],map[i][2]))&&equ(dis(map[i][0],map[i][1]),dis(map[i][1],map[i][2])))
55 {
56 printf("%c",i+97);
57 flag=true;
58 }
59 }
60 if(flag) printf("\n");
61 else printf("LOOOOOOOOSER!\n");
62 }
63 return 0;
64
65 }
66