大学时代写的程序,现在看起来真丑啊
/*
这是爱因斯坦在20世纪初提的谜题。在一条街上,有5座房子,喷5种颜色。每个房子住不同国籍的人,每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物。
请问谁养鱼?
1、英国人住红房子。
2、瑞典人养狗。
3、丹麦人喝茶。
4、绿色房子在白色房子左面隔壁。
5、绿色房子主人喝咖啡。
6、抽Pall Mall香烟的人养鸟。
7、黄色房子主人抽Dunhill香烟。
8、住在中间房子的人喝牛奶。
9、挪威人住在第一间房子。
10、抽Blends香烟的人住在养猫的人的隔壁。
11、养马的人住抽Dunhill香烟的人的隔壁。
12、抽Blue Master香烟的人喝啤酒。
13、德国人抽Prince香烟。
14、挪威人住在蓝色房子隔壁。
15、抽Blends香烟的人有个喝水的邻居。
*/
#include <stdio.h>
#include <stdlib.h>
enum
{
red,
green,
yellow,
blue,
white
};
char Color_str[5][20]=
{
"red",
"green",
"yellow",
"blue",
"white"
};
enum
{
english = 0,
ruidian,
danmai,
nuowei,
deguo
};
char Country_str[5][20]=
{
"english",
"ruidian",
"danmai",
"nuowei",
"deguo",
};
enum
{
pall_mall,
dunhill,
blends,
blue_master,
prince
};
char Cigarette_str[5][20] =
{
"pall_mall",
"dunhill",
"blends",
"blue_master",
"prince",
};
enum
{
dog=0,
bird,
cat,
horse,
fish
};
char Pets_str[5][20] =
{
"dog",
"bird",
"cat",
"horse",
"fish",
};
enum
{
tea,
coffee,
milk,
beer,
water
};
char Drink_str[5][20] =
{
"tea",
"coffee",
"milk",
"beer",
"water",
};
char Color[120][5];
char Country[120][5];
char Pets[120][5];
char Cigarette[120][5];
char Drink[120][5];
#define Copy(X,Y) \
(X)[Y][0] = i1;\
(X)[Y][1] = i2;\
(X)[Y][2] = i3;\
(X)[Y][3] = i4;\
(X)[Y][4] = i5;
#define Loop(V,Min,Max) \
for(int V=(Min);V<(Max);V++)
#define NEQ2(a,b) \
if(a == b)continue
#define NEQ3(a,b,c) \
if(a == b || a == c ) continue
#define NEQ4(a,b,c,d) \
if(a == b || a == c || a == d)continue
#define NEQ5(a,b,c,d,e) \
if(a == b || a == c || a == d || a == e)continue
#define CHECK(clr,cty,cig,pet,drk) \
/*1、英国人住红房子。*/ \
Country[(cty)][english] == Color[(clr)][red] && \
/*2、瑞典人养狗。*/ \
Country[(cty)][ruidian] == Pets[(pet)][dog] && \
/*3、丹麦人喝茶。*/ \
Country[(cty)][danmai] == Drink[(drk)][tea] && \
/*4、绿色房子在白色房子左面隔壁。*/ \
Color[(clr)][green] == Color[(clr)][white] - 1 && \
/*5、绿色房子主人喝咖啡。*/ \
Color[(clr)][green] == Drink[(drk)][coffee] && \
/*6、抽Pall Mall香烟的人养鸟。*/ \
Cigarette[(cig)][pall_mall] == Pets[(pet)][bird] && \
/*7、黄色房子主人抽Dunhill香烟。*/ \
Color[(clr)][yellow] == Cigarette[(cig)][dunhill] && \
/*8、住在中间房子的人喝牛奶。*/ \
Drink[(drk)][milk] == 2 && \
/*9、挪威人住在第一间房子。*/ \
Country[(cty)][nuowei] == 0 && \
/*10、抽Blends香烟的人住在养猫的人的隔壁。*/ \
(Cigarette[(cig)][blends] == Pets[(pet)][cat] - 1 || \
Cigarette[(cig)][blends] == Pets[(pet)][cat] + 1 )&& \
/*11、养马的人住抽Dunhill香烟的人的隔壁。*/ \
(Pets[(pet)][horse] == Cigarette[(cig)][dunhill] - 1 || \
Pets[(pet)][horse] == Cigarette[(cig)][dunhill] + 1) && \
/*12、抽Blue Master香烟的人喝啤酒。*/ \
Cigarette[(cig)][blue_master] == Drink[(drk)][beer] && \
/*13、德国人抽Prince香烟。*/ \
Country[(cty)][deguo] == Cigarette[(cig)][prince] && \
/*14、挪威人住在蓝色房子隔壁。*/ \
(Country[(cty)][nuowei] == Color[(clr)][blue] - 1 || \
Country[(cty)][nuowei] == Color[(clr)][blue] + 1 )&& \
/*15、抽Blends香烟的人有个喝水的邻居。*/ \
(Cigarette[(cig)][blends] == Drink[(drk)][water] - 1 || \
Cigarette[(cig)][blends] == Drink[(drk)][water] + 1 )
void init()
{
int i = 0;
Loop(i1,0,5)
Loop(i2,0,5)
{
NEQ2(i2,i1);
Loop(i3,0,5)
{
NEQ3(i3,i1,i2);
Loop(i4,0,5)
{
NEQ4(i4,i1,i2,i3);
Loop(i5,0,5)
{
NEQ5(i5,i1,i2,i3,i4);
if(i>=120)
{
printf("init failed!\n");
printf("%d,%d,%d,%d,%d\n",i1,i2,i3,i4,i5);
exit(0);
}
Copy(Color,i);
Copy(Country,i);
Copy(Pets,i);
Copy(Cigarette,i);
Copy(Drink,i);
i++;
}
}
}
}
}
void test_init()
{
Loop(i,0,120)
{
printf("%d : ",i);
Loop(j,0,5)
{
printf("%3d ",Color[i][j]);
}
printf("\n");
}
}
#define _TT(X,Y,V) \
(X)[(Y)][0] == (V) ? X ## _str[0] \
: (X)[(Y)][1] == (V) ? X ## _str[1] \
: (X)[(Y)][2] == (V) ? X ## _str[2] \
: (X)[(Y)][3] == (V) ? X ## _str[3] \
: (X)[(Y)][4] == (V) ? X ## _str[4] \
: ""
void print_result(int clr,int cty, int cig,int pet,int drk)
{
printf ("----------------- result -----------------\n");
printf ("house %7s %7s %11s %7s %7s\n",
"color", "country", "cigarette", "pet", "drink");
printf ("1 : %7s %7s %11s %7s %7s\n",
_TT(Color,clr,0), _TT(Country,cty,0),_TT(Cigarette,cig,0),_TT(Pets,pet,0),_TT(Drink,drk,0));
printf ("2 : %7s %7s %11s %7s %7s\n",
_TT(Color,clr,1), _TT(Country,cty,1),_TT(Cigarette,cig,1),_TT(Pets,pet,1),_TT(Drink,drk,1));
printf ("3 : %7s %7s %11s %7s %7s\n",
_TT(Color,clr,2), _TT(Country,cty,2),_TT(Cigarette,cig,2),_TT(Pets,pet,2),_TT(Drink,drk,2));
printf ("4 : %7s %7s %11s %7s %7s\n",
_TT(Color,clr,3), _TT(Country,cty,3),_TT(Cigarette,cig,3),_TT(Pets,pet,3),_TT(Drink,drk,3));
printf ("5 : %7s %7s %11s %7s %7s\n",
_TT(Color,clr,4), _TT(Country,cty,4),_TT(Cigarette,cig,4),_TT(Pets,pet,4),_TT(Drink,drk,4));
}
void main()
{
init();
// test_init();
// return;
printf("init success\n");
Loop(clr,0,120)
Loop(cty,0,120)
Loop(cig,0,120)
Loop(pet,0,120)
Loop(drk,0,120)
if(CHECK(clr,cty,cig,pet,drk))
{
printf("\n");
print_result(clr,cty,cig,pet,drk);
printf("\n");
}
}