問題描述
小花是一個熱愛健身的姑娘,這天她下載了一個跑步軟件,這個軟件可以記錄下小花跑步的軌跡。小花決定去公園跑步。公園裏有許許多多的座椅,小花希望在一些座椅休息一下,並且她在兩條座椅之間只跑直線。小花是一個完美主義者,她希望自己最後的軌跡是一個正三邊形或者正四邊形或者正五邊形或者正六邊形。小花會從某條座椅開始打開跑步軟件,並在回到這個座椅後關閉。
請問小花有多少種跑法。注:若兩種跑法經過的座椅集合相同則認爲是一種跑法。且經過一條座椅時沒有必要一定停下來
輸入描述
輸入有多組數據
每組數據第一行爲一個n(1 < = n < = 20)表示座椅數量
接下來n行,每行兩個整數xi,yi(0 < = xi,yi < = 8)表示座椅的座標
輸出描述
輸出方案數
輸入樣例
4
0 0
0 1
1 0
1 1
輸出樣例
1
官方題解:
地球人都知道整點是不能構成正五邊形和正三邊形和正六邊形的,所以只需暴力枚舉四個點判斷是否是正四邊形即可。假如你不是地球人,那麼即使暴力枚舉正三邊形和稍微不那麼暴力地找正五邊形和正六邊形也是可以通過的(反正找不到)。
至於如何判斷四個點是不是正方形,算出任意兩點的舉例,總共6條線段,然後看一下如果4條相等,另外兩條相等就是正方形
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <stack>
#include <set>
#include <algorithm>
#define For(i,a,b) for(int (i)=(a);(i) < (b);(i)++)
#define rof(i,a,b) for(int (i)=(a);(i) > (b);(i)--)
#define IOS ios::sync_with_stdio(false)
#define lson l,m,rt <<1
#define rson m+1,r,rt<<1|1
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 100;
const int INF =0x3f3f3f3f;
ll n;
int x[25];
int y[25];
double xx,yy;
double esp=0.00001;
double dis(int a,int b)
{
return sqrt((double)((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]) ) );
}
bool solve(int a,int b,int c,int d)
{
double dd[10];
dd[0]=dis(a,b);
dd[2]=dis(a,c),dd[3]=dis(a,d),dd[4]=dis(b,c),dd[5]=dis(b,d),dd[1]=dis(c,d);
map<double , int > mp;
map<double ,int >::iterator it,it2;
for(int i=0;i<6;i++)
if(mp.find(dd[i])==mp.end())
mp[dd[i]]=1;
else mp[dd[i]]++;
if(mp.size()!=2) return false;
it=mp.begin();
it2=it;
it2++;
if((it->second==2)&&(it2->second==4)||(it->second==4)&&(it2->second==2))
return true;
return false;
}
int main()
{
//freopen("input.txt","r",stdin);
IOS;
while(cin>>n){
For(i,0,n)cin>>x[i]>>y[i];
if(n<4){
cout<<0<<endl;
continue;
}
int ans=0;
for(int i=0;i<n-3;i++){
for(int j=i+1;j<n;j++){
for(int k=j+1;k<n;k++)
{
for(int l=k+1;l<n;l++)
{
if(solve(i,j,k,l))
ans++;
}
}
}
}
cout<<ans<<endl;
}
return 0;
}