科克曼女生问题
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("\n"); 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 }