C趣味程序百例(18)填表格

字號:

59.填表格
     將1、2、3、4、5和6 填入下表中,要使得每一列右邊的數(shù)字比左邊的數(shù)字大,每一行下面的數(shù)字比上面的數(shù)字大。按此要求,可有幾種填寫方法?
    *問題分析與算法設計
     按題目的要求進行分析,數(shù)字1一定是放在第一行第一列的格中,數(shù)字6一定是放在第二行第三列的格中。在實現(xiàn)時可用一個一維數(shù)組表示,前三個元素表示第一行,后三個元素表示第二行。先根據(jù)原題初始化數(shù)組,再根據(jù)題目中填 寫數(shù)字的要求進行試探。
    *程序與程序注釋
    #include
    int jud1(int s[]);
    void print(int u[]);
    int count; /*計數(shù)器*/
    void main()
    {
     static int a[]={1,2,3,4,5,6}; /*初始化數(shù)組*/
     printf("The possble table satisfied above conditions are:\n");
     for(a[1]=a[0]+1;a[1]<=5;++a[1]) /*a[1]必須大于a[0]*/
     for(a[2]=a[1]+1;a[2]<=5;++a[2]) /*a[2]必須大于a[1]*/
     for(a[3]=a[0]+1;a[3]<=5;++a[3]) /*第二行的a[3]必須大于a[0]*/
     for(a[4]=a[1]>a[3]?a[1]+1:a[3]+1;a[4]<=5;++a[4])
     /*第二行的a[4]必須大于左側(cè)a[3]和上邊a[1]*/
     if(jud1(a)) print(a); /*如果滿足題意,打印結(jié)果*/
    }
    int jud1(int s[])
    {
     int i,l;
     for(l=1;l<4;l++)
     for(i=l+1;i<5;++i)
     if(s[l]==s[i]) return 0; /*若數(shù)組中的數(shù)字有重復的,返回0*/
     return 1; /*若數(shù)組中的數(shù)字沒有重復的,返回1*/
    }
    void print(int u[])
    {
     int k;
     printf("\nNo.:%d",++count);
     for(k=0;k<6;k++)
     if(k%3==0) /*輸出數(shù)組的前三個元素作為第一行*/
     printf("\n%d",u[k]);
     else /*輸出數(shù)組的后三個元素作為第二行*/
     printf("%d",u[k]);
    }
    *運行結(jié)果
     The possble table satisfied above conditions are:
     No.1: No.2: No.3: No.4: No.5:
     1 2 3 1 2 4 1 2 5 1 3 4 1 3 5
     4 5 6 3 5 6 3 4 6 2 5 6 2 4 6