• 科克曼女生问题


      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 }

  • 相关阅读:
    P1182 数列分段 Section II 题解
    P3853 路标设置题解
    二分模板
    P2678 跳石头题解
    P2440 木材加工题解
    P1024 一元三次方程求解题解
    快速下载vscode的方法
    P1824 进击的奶牛题解
    P1873 砍树题解
    用户登录之asp.net cookie的写入、读取与操作
  • 原文地址:https://www.cnblogs.com/cmyg/p/6533562.html
Copyright © 2020-2023  润新知