hdu 4739
一个超级超级水的题,不明白当时比赛的时候没有出来;
思路很简单,dfs暴力一下就行,枚举每个顶点,题目一共才20个点,就是20^4方的时间复杂度,完全可以承受;
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 struct node 7 { 8 int x,y; 9 } no[22]; 10 bool use[22]; 11 int ans,num,n; 12 13 void dfs(int i) 14 { 15 ans=max(num,ans); 16 for(; i<n; i++) 17 { 18 if(use[i])continue; 19 use[i]=1; 20 for(int j=0; j<n; j++) 21 { 22 if(use[j]||no[j].x!=no[i].x) continue; 23 use[j]=1; 24 int l=no[i].y-no[j].y; 25 for(int k=0; k<n; k++) 26 { 27 if(use[k]||no[k].y!=no[j].y||(no[k].x-no[j].x)!=l) continue; 28 use[k]=1; 29 for(int m=0; m<n; m++) 30 { 31 if(use[m]||no[m].x!=no[k].x||(no[m].y-no[k].y)!=l)continue; 32 use[m]=1; 33 num+=4; 34 dfs(i+1); 35 use[m]=0; 36 num-=4; 37 } 38 use[k]=0; 39 } 40 use[j]=0; 41 } 42 use[i]=0; 43 } 44 } 45 46 int main() 47 { 48 while(scanf("%d",&n)&&n!=-1) 49 { 50 memset(use,0,sizeof use); 51 ans=num=0; 52 for(int i=0; i<n; i++) 53 scanf("%d%d",&no[i].x,&no[i].y); 54 if(n<4){puts("0");continue;} 55 dfs(0); 56 printf("%d\n",ans); 57 } 58 return 0; 59 }