1| 2| 3| 4| 5
颜色 黄| 篮| 红| 绿| 白
国际 挪威| 丹麦| 英国| 德国| 瑞典
饮料 水| 茶| 牛奶| 咖啡| 啤酒
香烟 Dunhill| Blends| Pall Mall| Prince| Blue Master
宠物 猫| 马| 鸟| 鱼| 狗
颜色 黄| 篮| 红| 绿| 白
国际 挪威| 丹麦| 英国| 德国| 瑞典
饮料 水| 茶| 牛奶| 咖啡| 啤酒
香烟 Dunhill| Blends| Pall Mall| Prince| Blue Master
宠物 猫| 马| 鸟| 鱼| 狗
/* ----------------------------------------------------------------------- *
房号 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;
}