1| 2| 3| 4| 5 
颜色 黄| 篮| 红| 绿| 白 
国际 挪威| 丹麦| 英国| 德国| 瑞典 
饮料 水| 茶| 牛奶| 咖啡| 啤酒 
香烟 Dunhill| Blends| Pall Mall| Prince| Blue Master 
宠物 猫| 马| 鸟| 鱼| 狗 

解决方案 »

  1.   

    #include"stdio.h"
    /* ----------------------------------------------------------------------- *
    房号  0    1    2    3    4
    颜色 黄色 蓝色 红色 绿色 白色 
    国籍 挪威      英国 
    饮料           牛奶 咖啡 
    香烟 DUNHmu 
    宠物       马 
    * ----------------------------------------------------------------------- */ 
    char * sColor[]       = { "黄色", "蓝色", "红色", "绿色", "白色" } ;
    enum Color_t            { yellow, blue, red, green, white }; 
    int  vColor[]         = { yellow, blue, red, green, white } ;
    int  iColor[]         = { 0, 1, 2, 3, 4 }; 
    char * sNationality[] = { "瑞典", "丹麦", "德国", "英国", "挪威" } ;
    enum Nationality_t      { Sweden, Den, Germany, Britain, Norway };
    int  vNationality[]   = { Norway, 0, Britain, 0, 0 };
    int  iNationality[]   = { 0, 0, 0, 2, 0 };
    char * sDrink[]       = { " 茶 ", "啤酒", " 水 ", "咖啡", "牛奶" }; 
    enum Drink_t            { tea, beer, water, coffee, milk }; 
    int  vDrink[]         = { 0, 0, milk, coffee, 0 }; 
    int  iDrink[]         = { 0, 0, 0, 3, 2 }; 
    char * sCigarette[]   = { "混合", "PRIN", "BLUE", "PALL", "DUNH" }; 
    enum Cigarette_t        { Bmix, Prince, BlueMaster, PallMall, Dunhill }; 
    int  vCigarette[]     = { Dunhill, 0, 0, 0, 0 }; 
    int  iCigarette[]     = { 0, 0, 0, 0, 0 }; 
    char * sPet[]         = { " 鸟 ", " 狗 ", " 鱼 ", " 猫 ", " 马 " }; 
    enum Pet_t              { bird, dog, fish, cat, horse }; 
    int  vPet[]           = { 0, horse, 0, 0, 0 }; 
    int  iPet[]           = { 0, 0, 0, 0, 1 };  
    int P3[][3] = { {0,1,2}, {0,2,1}, {1,0,2}, {1,2,0}, {2,0,1}, {2,1,0} }; 
    int P4[24][4]; 
     
    void initP4() 

     int i, j = 0, k; 
     for (k = 0; k < 4; k++) { 
       for (i = 0; i < 6; i++) { 
         P4[j][k]       = 3; 
         P4[j][(k+1)%4] = P3[i][0]; 
         P4[j][(k+2)%4] = P3[i][1]; 
         P4[j][(k+3)%4] = P3[i][2]; 
         j++; 
       } 
     } 

    void output() 

     int i; 
     printf("\n房号  0    1    2    3    4"); 
     printf("\n颜色"); 
     for (i = 0; i < 5; i++) printf(" %s", sColor[vColor[i]]); 
     printf("\n国籍"); 
     for (i = 0; i < 5; i++) printf(" %s", sNationality[vNationality[i]]); 
     printf("\n饮料"); 
     for (i = 0; i < 5; i++) printf(" %s", sDrink[vDrink[i]]); 
     printf("\n香烟"); 
     for (i = 0; i < 5; i++) printf(" %s", sCigarette[vCigarette[i]]); 
     printf("\n宠物"); 
     for (i = 0; i < 5; i++) printf(" %s", sPet[vPet[i]]); 
     printf("\n"); 

    void SetNationality(int i)

     iNationality[vNationality[1] = P3[i][0]] = 1; 
     iNationality[vNationality[3] = P3[i][1]] = 3;  
     iNationality[vNationality[4] = P3[i][2]] = 4; 

    void SetDrink(int i)

     iDrink[vDrink[0] = P3[i][0]] = 0; 
     iDrink[vDrink[1] = P3[i][1]] = 1; 
     iDrink[vDrink[4] = P3[i][2]] = 4; 

     
    void SetCigarette(int i) 

     iCigarette[vCigarette[1] = P4[i][0]] = 1; 
     iCigarette[vCigarette[2] = P4[i][1]] = 2; 
     iCigarette[vCigarette[3] = P4[i][2]] = 3; 
     iCigarette[vCigarette[4] = P4[i][3]] = 4; 

    void SetPet(int i) 

     iPet[vPet[0] = P4[i][0]] = 0; 
     iPet[vPet[2] = P4[i][1]] = 2; 
     iPet[vPet[3] = P4[i][2]] = 3; 
     iPet[vPet[4] = P4[i][3]] = 4; 

    // Return 1 for OK 
    int test(int i, int j, int k, int l) 

     SetNationality(i); 
     SetDrink(j); 
     SetCigarette(k); 
     SetPet(l); 
    /* -----------------------------------------------------------------------  *
    2  瑞典人养了一条狗 
    3  丹麦人喝茶 
    13 德国人抽PRINCE烟 
    12 抽BLUE MASTER烟的人喝啤酒 
    6  抽PALL MALL烟的人养了一只鸟 
    10 抽混合烟的人住在养猫人的旁边 
    15 抽混合烟的人的邻居喝矿泉水 
    * ----------------------------------------------------------------------- */ 
     if (iNationality[Sweden    ] != iPet      [dog   ]) return 0; 
     if (iNationality[Den   ] != iDrink    [tea   ]) return 0; 
     if (iNationality[Germany   ] != iCigarette[Prince]) return 0; 
     if (iCigarette  [BlueMaster] != iDrink    [beer  ]) return 0; 
     if (iCigarette  [PallMall  ] != iPet      [bird  ]) return 0; 
     if (iCigarette[Bmix] != iPet  [cat  ] + 1 && iCigarette[Bmix] != iPet  [cat]   - 1) return 0; 
     if (iCigarette[Bmix] != iDrink[water] + 1 && iCigarette[Bmix] != iDrink[water] - 1) return 0; 
     return 1; 

    int main() 

     int i, j, k, l; 
     initP4();| 
     for (i = 0; i < 6; i++) 
       for (j = 0; j < 6; j++) 
         for (k = 0; k < 24; k++)
           for (l = 0; l < 24; l++) 
             if (test(i, j, k, l)) output(); 
     return 0; 

      

  2.   

    classjava(原始野人)  这位达人给出的答案果然精彩!暂时先不结贴,大家继续。最好有Java版本的解决方案!