C趣味編程百例(06)平分七筐魚

字號:

17.平分七筐魚
     甲、乙、丙三位魚夫出海打魚,他們隨船帶了21只籮筐。當晚返航時,他們發(fā)現(xiàn)有七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐則是空的,由于他們沒有秤,只好通過目測認為七個滿筐魚的重量是相等的,7個半筐魚的重量是相等的。在不將魚倒出來的前提下,怎樣將魚和筐平分為三份?
    *問題分析與算法設計
     根據(jù)題意可以知道:每個人應分得七個籮筐,其中有3.5筐魚。采用一個3*3的數(shù)組a來表示三個人分到的東西。其中每個人對應數(shù)組a的一行,數(shù)組的第0列放分到的魚的整筐數(shù),數(shù)組的第1列放分到的半筐數(shù),數(shù)組的第2列放分到的空筐數(shù)。由題目可以推出:
     。數(shù)組的每行或每列的元素之和都為7;
     。對數(shù)組的行來說,滿筐數(shù)加半筐數(shù)=3.5;
     。每個人所得的滿筐數(shù)不能超過3筐;
     。每個人都必須至少有1 個半筐,且半筐數(shù)一定為奇數(shù)
     對于找到的某種分魚方案,三個人誰拿哪一份都是相同的,為了避免出現(xiàn)重復的分配方案,可以規(guī)定:第二個人的滿筐數(shù)等于第一個人的滿筐數(shù);第二個人的半筐數(shù)大于等于第一個人的半筐數(shù)。
    *程序與程序注釋
    #include
    int a[3][3],count;
    void main()
    {
     int i,j,k,m,n,flag;
     printf("It exists possible distribtion plans:\n");
     for(i=0;i<=3;i++) /*試探第一個人滿筐a[0][0]的值,滿筐數(shù)不能>3*/
     {
     a[0][0]=i;
     for(j=i;j<=7-i&&j<=3;j++) /*試探第二個人滿筐a[1][0]的值,滿筐數(shù)不能>3*/
     {
     a[1][0]=j;
     if((a[2][0]=7-j-a[0][0])>3)continue; /*第三個人滿筐數(shù)不能>3*/
     if(a[2][0]=前一個人,以排除重復情況*/
     for(k=1;k<=5;k+=2) /*試探半筐a[0][1]的值,半筐數(shù)為奇數(shù)*/
     {
     a[0][1]=k;
     for(m=1;m<7-k;m+=2) /*試探 半筐a[1][1]的值,半筐數(shù)為奇數(shù)*/
     {
     a[1][1]=m;
     a[2][1]=7-k-m;
     for(flag=1,n=0;flag&&n<3;n++)
     /*判斷每個人分到的魚是 3.5筐,flag為滿足題意的標記變量*/
     if(a[n][0]+a[n][1]<7&&a[n][0]*2+a[n][1]==7)
     a[n][2]=7-a[n][0]-a[n][1]; /*計算應得到的空筐數(shù)量*/
     else flag=0; /*不符合題意則置標記為0*/
     if(flag)
     {
     printf("No.%d Full basket Semi--basket Empty\n",++count);
     for(n=0;n<3;n++)
     printf(" fisher %c: %d %d %d\n",
     ’A’+n,a[n][0],a[n][1],a[n][2]);
     }
     }
     }
     }
     }
    }
    * 運行結(jié)果
    It exists possible distribution plans:
     No.1 Full basket Semi--basket Empty
     fisher A: 1 5 1
     fisher B: 3 1 3
     fisher C: 3 1 3
     No.2 Full basket Semi--basket Empty
     fisher A: 2 3 2
     fisher B: 2 3 2