1.用斜率式+解方程:
#include<bits/stdc++.h>
#define y1 _y
#define N 15
using namespace std;
int n,p[N];
double x[N],y[N],x1[N],y1[N],x2[N],y2[N];
void make(double x1,double y1,double x2,double y2,double &k,double &b){
k=(y1-y2)/(x1-x2);
b=y1-k*x1;
}
bool check(){
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
double k1,b1,k2,b2;
make(x1[j],y1[j],x2[j],y2[j],k1,b1);
make(x1[i],y1[i],x2[i],y2[i],k2,b2);
if(k1==k2) continue;
double x=(b2-b1)/(k1-k2);
if(x>min(x1[j],x2[j])&&x<max(x1[j],x2[j])&&x>min(x1[i],x2[i])&&x<max(x1[i],x2[i])) return 0;
}
}
return 1;
}
int main(){
while(~scanf("%lf%lf",&x[n+1],&y[n+1])) n++;
for(int i=1;i<=n;i++) p[i]=i;
int ans=0;
do{
for(int i=1;i<=n;i++){x1[i]=x[p[i]];y1[i]=y[p[i]];x2[i]=x[p[i+1]];y2[i]=y[p[i+1]];}
x2[n]=x[p[1]];y2[n]=y[p[1]];
if(check()) ans++;
}while(next_permutation(p+1,p+n+1));
printf("%d",ans/n/2);
return 0;
}
评测结果:样例没过,25分
2.用向量交叉乘:
#include<bits/stdc++.h>
#define y1 _y
#define N 15
using namespace std;
int n,p[N],x[N],y[N],x1[N],y1[N],x2[N],y2[N];
int pro(int x1,int y1,int x2,int y2){
return x1*y2-y1*x2;
}
bool checkk(int xa,int ya,int xb,int yb,int xc,int yc,int xd,int yd){
return pro(xb-xa,yb-ya,xc-xa,yc-ya)*pro(xb-xa,yb-ya,xd-xa,yd-ya)<0&&pro(xd-xc,yd-yc,xc-xa,yc-ya)*pro(xd-xc,yd-yc,xc-xb,yc-yb)<0;
}
bool check(){
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
if(checkk(x1[i],y1[i],x2[i],y2[i],x1[j],y1[j],x2[j],y2[j])) return 0;
}
}
return 1;
}
int main(){
while(~scanf("%d%d",&x[n+1],&y[n+1])) n++;
for(int i=1;i<=n;i++) p[i]=i;
int ans=0;
do{
for(int i=1;i<=n;i++){x1[i]=x[p[i]];y1[i]=y[p[i]];x2[i]=x[p[i+1]];y2[i]=y[p[i+1]];}
x2[n]=x[p[1]];y2[n]=y[p[1]];
if(check()) ans++;
}while(next_permutation(p+1,p+n+1));
printf("%d",ans/n/2);
return 0;
}
评测结果:100