科克曼女生问题

  1850年,科克曼在《女士与先生之日记》杂志上发表了题为的文章,提出了15个女学生问题:一位女教师每天带领好班上的15名女生去散步,她把这些女生按3人一组分成5组,问能不能作出一个连续散步7天的分组计划,使得任意两个女生曾被分到一组且仅被分到一组,也就是说,随便从15人中挑出 2人,她俩在一周所分成的35个小组里必在一组中见过一面,且仅见一面

  解法:暴力搜索,很快得到一个解,不过其它解很长时间未得到

  每天有1,6816,8000种分组可能性,共七天……

 1 #include <stdio.h> 
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 
 5 int arr[8][16],p[6]={0,1,4,7,10,13};
 6 bool vis[16][16],use[8][16];
 7 
 8 void dfs(int day,int group)
 9 {
10     int i,j,pos;
11     for (pos=1;pos<=15;pos++)
12         if (use[day][pos])
13             break;
14     arr[day][p[group]]=pos;
15     use[day][pos]=false;
16     for (i=pos+1;i<=15;i++)
17         if (use[day][i] && vis[pos][i])
18             for (j=i+1;j<=15;j++)
19                 if (use[day][j] && vis[pos][j] && vis[i][j])
20                 {
21                     use[day][i]=false;
22                     use[day][j]=false;
23                     vis[pos][i]=false;
24                     vis[pos][j]=false;
25                     vis[i][j]=false;
26                     arr[day][p[group]+1]=i;
27                     arr[day][p[group]+2]=j;
28                     
29                     if (group==5)
30                     {
31                         if (day==7)
32                         {
33                             for (i=1;i<=7;i++)
34                             {
35                                 for (j=1;j<=15;j++)
36                                 {
37                                     printf("%d ",arr[i][j]);
38                                     if (j%3==0)
39                                         printf("; ");
40                                 }
41                                     
42                                 printf("
");
43                             }            
44                         }
45                         else
46                             dfs(day+1,1);
47                     }
48                     else
49                         dfs(day,group+1);
50 
51                     use[day][i]=true;
52                     use[day][j]=true;
53                     vis[pos][i]=true;
54                     vis[pos][j]=true;
55                     vis[i][j]=true;                    
56                 }
57     use[day][pos]=true;
58 }
59 
60 int main()
61 {
62     int i,j;
63     for (i=1;i<=15;i++)
64         arr[1][i]=i;
65     for (i=1;i<=15;i++)
66         for (j=1;j<=15;j++)
67             vis[i][j]=true;
68     for (i=1;i<=7;i++)
69         for (j=1;j<=15;j++)
70             use[i][j]=true;
71     for (i=1;i<=5;i++)
72     {
73         vis[p[i]][p[i]+1]=false;
74         vis[p[i]][p[i]+2]=false;
75         vis[p[i]+1][p[i]+2]=false;
76     }
77     dfs(2,1);
78     
79 //    int i;
80 //    long long ans=1;
81 //    for (i=1;i<=15;i++)
82 //        ans*=i;
83 //    for (i=1;i<=5;i++)
84 //        ans/=6;
85 //    printf("%lld",ans);
86 //    //1,6816,8000
87     return 0;
88 }

原文地址:https://www.cnblogs.com/cmyg/p/6533562.html