刚才在 VC6.0 下编译出现了大量 error,就略作了下修改:- /************
- * 关于爱因斯坦98%的人都回答不出来的粗浅程序, 鉴于网络上没有很好的C参考程序, \
- * 这里尝试写一个, 聊博一笑! *^_^*, 请在VC6.0或以上环境编译!
- * Email: silitex@yeah.net
- * 注: 如采用原始枚举: (5!)^5 = 24,883,200,000, 在普通的电脑需运行1分钟以上, \
- * 故做一个算法优化, 在枚举时, 把已知的2个条件: 牛奶 = 2, 挪威人 = 0, \
- * 直接确定; 这样算法的枚举次数为: (4!)^2*(5!)^3 = 995,328,000.
- * 用C++的标准做法应该把所有的内容封装成类, 否则太容易因为下表取错而出错!
- ***/
- #include <stdio.h>
- #include <math.h>
- #define N 5
- #define N_NAME 24 /* Name的枚举次数 */
- #define N_COLOR 120
- #define N_DRINK 24
- #define N_CIG 120
- #define N_PET 120
- enum E_NAME {ENGLISH, SWEDISH, DANE, NORWEGIAN, GERMAN};
- enum E_COLOR {RED, GREEN, WHITE, YELLOW, BLUE};
- enum E_DRINK {TEA, COFFEE, MILK, BEER, WATER};
- enum E_CIGARETTE {PALLMALL, DUNHILL, BLENDS, BLUEMASTER, PRINCE}; // Cigar类?
- enum E_PET {DOG, BIRD, CAT, HORSE, FISH};
- const char *NAME[] = {"英国人", "瑞典人", "丹麦人", "挪威人", "德国人"};// 人名
- const char *COLOR[] = {"红", "绿", "白", "黄", "蓝"}; // 颜色
- const char *DRINK[] = {"茶", "咖啡", "牛奶", "啤酒", "水"}; // 饮料
- const char *CIGARETTE[] = {"PallMal", "Dunhill", "混合烟", "BlueMas", \
- "Prince"}; // 香烟
- const char *PET[] = {"狗", "鸟", "猫", "马", "鱼"}; // 宠物
- extern const int ENUM_NAME[][N];
- extern const int ENUM_DRINK[][N];
- extern const int ENUM_ALL[][N];
- int main(void)
- {
- int tmp_name[N]; // 临时数组, 以上面的枚举变量为索引, 指示在第几栋房子
- int tmp_color[N];
- int tmp_drink[N];
- int tmp_cig[N];
- int tmp_pet[N];
- int out_name[N]; // 输出数组, 以第几栋房子为位置, 记录上面的枚举变量值
- int out_color[N];
- int out_drink[N];
- int out_cig[N];
- int out_pet[N];
- int i;
- long per;
- for (int n = 0; n < N_NAME; n++)
- {
- for (i = 0; i < N; i++)
- tmp_name[ENUM_NAME[n][i]] = i;
- for (int c = 0; c < N_COLOR; c++)
- {
- for (i = 0; i < N; i++)
- tmp_color[i] = ENUM_ALL[c][i];
- for (int d = 0; d < N_DRINK; d++)
- {
- for (i = 0; i < N; i++)
- tmp_drink[ENUM_DRINK[d][i]] = i;
- for (int c2 = 0; c2 < N_CIG; c2++)
- {
- for (i = 0; i < N; i++)
- tmp_cig[i] = ENUM_ALL[c2][i];
- for (int p = 0; p < N_PET; p++)
- {
- for (i = 0; i < N; i++)
- tmp_pet[i] = ENUM_ALL[p][i];
- /* 前面的就是枚举所有可能行, 下面的工作就根据条件判断\
- * 已知我们用掉了5个初始条件, 所以这里判断10个剩余条件.
- */
- if (tmp_name[ENGLISH] != tmp_color[RED])
- continue;
- if (tmp_name[SWEDISH] != tmp_pet[DOG])
- continue;
- if (tmp_name[DANE] != tmp_drink[TEA])
- continue;
- if (tmp_color[GREEN] != tmp_drink[COFFEE])
- continue;
- if (tmp_cig[PALLMALL] != tmp_pet[BIRD])
- continue;
- if (tmp_color[YELLOW] != tmp_cig[DUNHILL])
- continue;
- if (tmp_cig[BLUEMASTER] != tmp_drink[BEER])
- continue;
- if (tmp_name[GERMAN] != tmp_cig[PRINCE])
- continue;
- #if 1 // 绿在白的左边, 且必须为邻居
- if (tmp_color[GREEN]+1 != tmp_color[WHITE])
- continue;
- #else // 绿在白的左边, 不必为邻居
- if (tmp_color[GREEN] >= tmp_color[WHITE])
- continue;
- #endif
- if (abs(tmp_cig[BLENDS]-tmp_pet[CAT]) != 1)
- continue;
- if (abs(tmp_pet[HORSE]-tmp_cig[DUNHILL]) != 1)
- continue;
- if (abs(tmp_name[NORWEGIAN]-tmp_color[BLUE]) != 1)
- continue;
- #if 1 // 这个条件多余, 可以不用.
- if (abs(tmp_cig[BLENDS]-tmp_drink[WATER]) != 1)
- continue;
- #endif
- // 如果上面的条件都满足, 则显示出来
- for (i = 0; i < N; i++)
- {
- out_name[tmp_name[i]] = i;
- out_color[tmp_color[i]] = i;
- out_drink[tmp_drink[i]] = i;
- out_cig[tmp_cig[i]] = i;
- out_pet[tmp_pet[i]] = i;
- }
- printf("\nposi: 0 1 2 3 4");
- printf("\nname: %-7s %-7s %-7s %-7s %-7s\n", \
- NAME[out_name[0]], NAME[out_name[1]], \
- NAME[out_name[2]], NAME[out_name[3]], \
- NAME[out_name[4]]);
- printf("color: %-7s %-7s %-7s %-7s %-7s\n", \
- COLOR[out_color[0]], COLOR[out_color[1]], \
- COLOR[out_color[2]], COLOR[out_color[3]], \
- COLOR[out_color[4]]);
- printf("drink: %-7s %-7s %-7s %-7s %-7s\n", \
- DRINK[out_drink[0]], DRINK[out_drink[1]], \
- DRINK[out_drink[2]], DRINK[out_drink[3]], \
- DRINK[out_drink[4]]);
- printf("cig: %-7s %-7s %-7s %-7s %-7s\n", \
- CIGARETTE[out_cig[0]], CIGARETTE[out_cig[1]], \
- CIGARETTE[out_cig[2]], CIGARETTE[out_cig[3]], \
- CIGARETTE[out_cig[4]]);
- printf("pet: %-7s %-7s %-7s %-7s %-7s\n", \
- PET[out_pet[0]], PET[out_pet[1]], \
- PET[out_pet[2]], PET[out_pet[3]], \
- PET[out_pet[4]]);
- }
- }
- }
- // 显示当前的进度
- per = ((N_COLOR*(long)n)+(long)c+1)*100/(N_NAME*N_COLOR);
- printf("\rProgress: %02d%% ", per);
- }
- }
- return 0;
- }
- const int ENUM_NAME[][N] = {
- {NORWEGIAN, ENGLISH, SWEDISH, DANE , GERMAN },
- {NORWEGIAN, ENGLISH, SWEDISH, GERMAN , DANE },
- {NORWEGIAN, ENGLISH, DANE , SWEDISH, GERMAN },
- {NORWEGIAN, ENGLISH, DANE , GERMAN , SWEDISH},
- {NORWEGIAN, ENGLISH, GERMAN , SWEDISH, DANE },
- {NORWEGIAN, ENGLISH, GERMAN , DANE , SWEDISH},
- {NORWEGIAN, SWEDISH, ENGLISH, DANE , GERMAN },
- {NORWEGIAN, SWEDISH, ENGLISH, GERMAN , DANE },
- {NORWEGIAN, SWEDISH, DANE , ENGLISH, GERMAN },
- {NORWEGIAN, SWEDISH, DANE , GERMAN , ENGLISH},
- {NORWEGIAN, SWEDISH, GERMAN , ENGLISH, DANE },
- {NORWEGIAN, SWEDISH, GERMAN , DANE , ENGLISH},
- {NORWEGIAN, DANE , ENGLISH, SWEDISH, GERMAN },
- {NORWEGIAN, DANE , ENGLISH, GERMAN , SWEDISH},
- {NORWEGIAN, DANE , SWEDISH, ENGLISH, GERMAN },
- {NORWEGIAN, DANE , SWEDISH, GERMAN , ENGLISH},
- {NORWEGIAN, DANE , GERMAN , ENGLISH, SWEDISH},
- {NORWEGIAN, DANE , GERMAN , SWEDISH, ENGLISH},
- {NORWEGIAN, GERMAN , ENGLISH, SWEDISH, DANE },
- {NORWEGIAN, GERMAN , ENGLISH, DANE , SWEDISH},
- {NORWEGIAN, GERMAN , SWEDISH, ENGLISH, DANE },
- {NORWEGIAN, GERMAN , SWEDISH, DANE , ENGLISH},
- {NORWEGIAN, GERMAN , DANE , ENGLISH, SWEDISH},
- {NORWEGIAN, GERMAN , DANE , SWEDISH, ENGLISH},
- };
- const int ENUM_DRINK[][N] = {
- {TEA , COFFEE , MILK , BEER , WATER },
- {TEA , COFFEE , MILK , WATER , BEER },
- {TEA , BEER , MILK , COFFEE , WATER },
- {TEA , BEER , MILK , WATER , COFFEE },
- {TEA , WATER , MILK , COFFEE , BEER },
- {TEA , WATER , MILK , BEER , COFFEE },
- {COFFEE , TEA , MILK , BEER , WATER },
- {COFFEE , TEA , MILK , WATER , BEER },
- {COFFEE , BEER , MILK , TEA , WATER },
- {COFFEE , BEER , MILK , WATER , TEA },
- {COFFEE , WATER , MILK , TEA , BEER },
- {COFFEE , WATER , MILK , BEER , TEA },
- {BEER , TEA , MILK , COFFEE , WATER },
- {BEER , TEA , MILK , WATER , COFFEE },
- {BEER , COFFEE , MILK , TEA , WATER },
- {BEER , COFFEE , MILK , WATER , TEA },
- {BEER , WATER , MILK , TEA , COFFEE },
- {BEER , WATER , MILK , COFFEE , TEA },
- {WATER , TEA , MILK , COFFEE , BEER },
- {WATER , TEA , MILK , BEER , COFFEE },
- {WATER , COFFEE , MILK , TEA , BEER },
- {WATER , COFFEE , MILK , BEER , TEA },
- {WATER , BEER , MILK , TEA , COFFEE },
- {WATER , BEER , MILK , COFFEE , TEA },
- };
- const int ENUM_ALL[][N] = {
- {0,1,2,3,4}, {0,1,2,4,3}, {0,1,3,2,4}, {0,1,3,4,2}, {0,1,4,2,3},
- {0,1,4,3,2}, {0,2,1,3,4}, {0,2,1,4,3}, {0,2,3,1,4}, {0,2,3,4,1},
- {0,2,4,1,3}, {0,2,4,3,1}, {0,3,1,2,4}, {0,3,1,4,2}, {0,3,2,1,4},
- {0,3,2,4,1}, {0,3,4,1,2}, {0,3,4,2,1}, {0,4,1,2,3}, {0,4,1,3,2},
- {0,4,2,1,3}, {0,4,2,3,1}, {0,4,3,1,2}, {0,4,3,2,1}, {1,0,2,3,4},
- {1,0,2,4,3}, {1,0,3,2,4}, {1,0,3,4,2}, {1,0,4,2,3}, {1,0,4,3,2},
- {1,2,0,3,4}, {1,2,0,4,3}, {1,2,3,0,4}, {1,2,3,4,0}, {1,2,4,0,3},
- {1,2,4,3,0}, {1,3,0,2,4}, {1,3,0,4,2}, {1,3,2,0,4}, {1,3,2,4,0},
- {1,3,4,0,2}, {1,3,4,2,0}, {1,4,0,2,3}, {1,4,0,3,2}, {1,4,2,0,3},
- {1,4,2,3,0}, {1,4,3,0,2}, {1,4,3,2,0}, {2,0,1,3,4}, {2,0,1,4,3},
- {2,0,3,1,4}, {2,0,3,4,1}, {2,0,4,1,3}, {2,0,4,3,1}, {2,1,0,3,4},
- {2,1,0,4,3}, {2,1,3,0,4}, {2,1,3,4,0}, {2,1,4,0,3}, {2,1,4,3,0},
- {2,3,0,1,4}, {2,3,0,4,1}, {2,3,1,0,4}, {2,3,1,4,0}, {2,3,4,0,1},
- {2,3,4,1,0}, {2,4,0,1,3}, {2,4,0,3,1}, {2,4,1,0,3}, {2,4,1,3,0},
- {2,4,3,0,1}, {2,4,3,1,0}, {3,0,1,2,4}, {3,0,1,4,2}, {3,0,2,1,4},
- {3,0,2,4,1}, {3,0,4,1,2}, {3,0,4,2,1}, {3,1,0,2,4}, {3,1,0,4,2},
- {3,1,2,0,4}, {3,1,2,4,0}, {3,1,4,0,2}, {3,1,4,2,0}, {3,2,0,1,4},
- {3,2,0,4,1}, {3,2,1,0,4}, {3,2,1,4,0}, {3,2,4,0,1}, {3,2,4,1,0},
- {3,4,0,1,2}, {3,4,0,2,1}, {3,4,1,0,2}, {3,4,1,2,0}, {3,4,2,0,1},
- {3,4,2,1,0}, {4,0,1,2,3}, {4,0,1,3,2}, {4,0,2,1,3}, {4,0,2,3,1},
- {4,0,3,1,2}, {4,0,3,2,1}, {4,1,0,2,3}, {4,1,0,3,2}, {4,1,2,0,3},
- {4,1,2,3,0}, {4,1,3,0,2}, {4,1,3,2,0}, {4,2,0,1,3}, {4,2,0,3,1},
- {4,2,1,0,3}, {4,2,1,3,0}, {4,2,3,0,1}, {4,2,3,1,0}, {4,3,0,1,2},
- {4,3,0,2,1}, {4,3,1,0,2}, {4,3,1,2,0}, {4,3,2,0,1}, {4,3,2,1,0},
- };
复制代码 |