通過叉積判斷邊的相對位置,(類似極角排序),就可以判斷兩個三角形是否可以通過旋轉重合。
https://blog.csdn.net/w326159487/articl
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
# define ll long long
# define inf 0x3f3f3f3f
using namespace std;
struct code
{
int x,y;
} point[15];
int dist(int x,int y)
{
return (point[x].x-point[y].x)*(point[x].x-point[y].x)+(point[x].y-point[y].y)*(point[x].y-point[y].y);
}
int cj(int a,int b,int c)
{
return (point[b].x-point[a].x)*(point[c].y-point[a].y)-(point[b].y-point[a].y)*(point[c].x-point[a].x);
}
int t,n,top;
int main()
{
scanf("%d",&t);
while(t--)
{
int ans=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d%d",&point[i].x,&point[i].y);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(j==i)
continue;
for(int k=0; k<n; k++)
{
if(k==i||k==j)
continue;
for(int p=0; p<n; p++)
{
if(p==i||p==j||p==k)
continue;
for(int q=0; q<n; q++)
{
if(q==i||q==j||q==k||q==p)
continue;
for(int r=0; r<n; r++)
{
if(r==i||r==j||r==k||r==p||r==q)
continue;
int a1,b1,c1,a2,b2,c2;
int s=cj(i,j,k);
if(s==0)
continue;
else if(s>0)
{
a1=dist(i,k);
b1=dist(k,j);
c1=dist(j,i);
}
else
{
a1=dist(i,j);
b1=dist(j,k);
c1=dist(k,i);
}
s=cj(p,q,r);
if(s==0)
continue;
else if(s>0)
{
a2=dist(p,r);
b2=dist(r,q);
c2=dist(q,p);
}
else
{
a2=dist(p,q);
b2=dist(q,r);
c2=dist(r,p);
}
if(a1==a2&&b1==b2&&c1==c2)
ans++;
else if(a1==b2&&b1==c2&&c1==a2)
ans++;
else if(a1==c2&&b1==a2&&c1==b2)
ans++;
}
}
}
}
}
}
printf("Case %d: %d\n",++top,ans/36);
}
return 0;
}