给出一些木棒的长度,问是否可以组合起来成一个正方形
比较经典的DFS题目,第一次见数组的DFs而非图论里面的,数组的DFS需要带一个数组下标的参数
由于dfs所以注意在标记数组的时候要注意还原
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<algorithm>
4 using namespace std;
5 int aver,flag,n,a[30],visited[30]={0};
6 int cmp(int x,int y)
7 { return x>y;}
8 int main()
9 {
10 void dsf(int x,int y,int z);
11 int ca;
12 scanf("%d",&ca);
13 while(ca--)
14 {
15 int i,t=0;
16 scanf("%d",&n);
17 for(i=0;i<n;i++)
18 {
19 scanf("%d",&a[i]);
20 visited[i]=0;
21 t=t+a[i];
22 }
23 if(t%4!=0)
24 {
25 printf("no\n");
26 continue;
27 }
28 aver=t/4;
29 for(i=0;i<n;i++)
30 if(a[i]>aver)break;
31 if(i<n)
32 {
33 printf("no\n");
34 continue;
35 }
36 sort(a,a+n,cmp);
37 printf("%d %d\n",a[0],a[1]);
38 flag=0;
39 dsf(-1,0,0);
40 if(flag==0) printf("no\n");
41 else printf("yes\n");
42 }}
43 void dsf(int x,int y,int z)//从第x个数据往下寻找,当前的和为y,并且已经找到z条边
44 {
45 if(z==3){flag=true;return ;}
46 for(int j=x+1;j<n&&!flag;j++)
47 {
48 if(!visited[j]&&y+a[j]<=aver){
49 visited[j]=1;
50 if(y+a[j]<aver)
51 dsf(j,y+a[j],z);
52 else dsf(0,0,z+1);
53 visited[j]=0;
54
55 }
56
57
58 }
59
60
61
62 }