看板 ACMCLUB 關於我們 聯絡資訊
※ 引述《ledia (totally defeated)》之銘言: : ※ 引述《miname (這本書有開始卻沒有結束)》之銘言: : : 取相鄰兩點和相隔一點的兩點作中垂線即可(可以先砍掉一半的線) : : 我做出來是0.002s AC...不知道0.000秒的傢伙怎麼寫的.... : 它... 一定是偶數個點嗎? @@ 奇數也沒關係,我的做法也是可以work... 因為我會把每個點兩兩平均檢查是否在對稱線上 檢查到最後就會把奇數的那個點當成兩個點平均看是否在線上... 結果...OK.. 附看不懂的code以解疑慮(反正就暴力內積給她乘下去啦...) -- #include<stdio.h> void main() { int t; int n; int mid; struct{ int x,y,dx,dy; }middle; int data[100][2]; int i,j; int yes; scanf("%d",&t); for (i=0;i<t;i++) { yes=0; scanf("%d",&n); for (j=0;j<n;j++) { scanf("%d %d",&data[j][0],&data[j][1]); } for(mid=0;mid<(n+1)/2;mid++) { middle.x=data[mid][0]+data[(mid+n-1)%n][0]; middle.y=data[mid][1]+data[(mid+n-1)%n][1]; middle.dx=data[mid][0]-data[(mid+n-1)%n][0]; middle.dy=data[mid][1]-data[(mid+n-1)%n][1]; for(j=0;j<=n/2;j++) { if(((data[mid+j][0]+data[(mid-j+n-1)%n][0]-middle.x)*middle.dx+middle.dy*(data[mid+j][1]+data[(mid-j+n-1)%n][1]-middle.y))!=0) { break; } } if(j==(int)(n/2+1)) { yes=1; break; } } for(mid=0;mid<=(n+1)/2;mid++) { middle.x=data[mid+1][0]+data[(mid+n-1)%n][0]; middle.y=data[mid+1][1]+data[(mid+n-1)%n][1]; middle.dx=data[mid+1][0]-data[(mid+n-1)%n][0]; middle.dy=data[mid+1][1]-data[(mid+n-1)%n][1]; for(j=0;j<=n/2;j++) { if(((data[mid+j][0]+data[(mid-j+n)%n][0]-middle.x)*middle.dx+middle.dy*(data[mid+j][1]+data[(mid-j+n)%n][1]-middle.y))!=0) { break; } } if(j==(int)(n/2+1)) { yes=1; break; } } if(yes) { printf("Yes\n"); } else { printf("No\n"); } } } -- ※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw) ◆ From: 218.187.85.106 ※ 編輯: miname 來自: 218.187.85.106 (01/13 03:04)