hdu 4739

一个超级超级水的题,不明白当时比赛的时候没有出来;

思路很简单,dfs暴力一下就行,枚举每个顶点,题目一共才20个点,就是20^4方的时间复杂度,完全可以承受;

代码:

 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 }
View Code

 

posted @ 2013-09-16 22:06  Yours1103  阅读(184)  评论(0编辑  收藏  举报