程序代码:
#include <stdio.h>
#define check1(value, index) ((((value) >> ((index) - 'A')) & 1) == 1)
#define check0(value, index) ((((value) >> ((index) - 'A')) & 1) == 0)
void print(int test)
{
int ch;
for (ch = 'A'; ch <= 'J'; ch++)
if (check1(test, ch))
printf("%c ", ch);
printf("\n");
}
int t0(int test) {return check0(test, 'A') || check1(test, 'B');} /* 如果A参加,B也参加 */
int t1(int test) {return check1(test, 'C') || check0(test, 'D');} /* 如果C不参加,D也不参加 */
int t2(int test) {return check0(test, 'A') || check0(test, 'C');} /* A和C中只能有一个人参加 */
int t3(int test) {return (check1(test, 'B') && check0(test, 'D')) || (check0(test, 'B') && check1(test, 'D'));} /* B和D中有且仅有一个人参加 */
int t4(int test) {return !((check1(test, 'D') && check0(test, 'E') && check0(test, 'F') && check0(test, 'G') && check0(test, 'H')) ||
(check0(test, 'D') && check1(test, 'E') && check0(test, 'F') && check0(test, 'G') && check0(test, 'H')) ||
(check0(test, 'D') && check0(test, 'E') && check1(test, 'F') && check0(test, 'G') && check0(test, 'H')) ||
(check0(test, 'D') && check0(test, 'E') && check0(test, 'F') && check1(test, 'G') && check0(test, 'H')) ||
(check0(test, 'D') && check0(test, 'E') && check0(test, 'F') && check0(test, 'G') && check1(test, 'H')) ||
(check0(test, 'D') && check0(test, 'E') && check0(test, 'F') && check0(test, 'G') && check0(test, 'H')));} /* D、E、F、G、H 中至少有2人参加 */
int t5(int test) {return (check1(test, 'C') && check1(test, 'G')) || (check0(test, 'C') && check0(test, 'G'));} /* C和G或者都参加,或者都不参加 */
int t6(int test) {return !((check1(test, 'C') && check1(test, 'E') && check1(test, 'G') && check1(test, 'I')) ||
(check0(test, 'C') && check1(test, 'E') && check1(test, 'G') && check1(test, 'I')) ||
(check1(test, 'C') && check0(test, 'E') && check1(test, 'G') && check1(test, 'I')) ||
(check1(test, 'C') && check1(test, 'E') && check0(test, 'G') && check1(test, 'I')) ||
(check1(test, 'C') && check1(test, 'E') && check1(test, 'G') && check0(test, 'I')));} /* C、E、G、I中至多只能2人参加 */
int t7(int test) {return check0(test, 'E') || (check1(test, 'F') && check1(test, 'G'));} /* 如果E参加,那么F和G也都参加 */
int t8(int test) {return check0(test, 'F') || (check0(test, 'G') && check0(test, 'H'));} /* 如果F参加,G、H就不能参加 */
int t9(int test) {return (check1(test, 'I') || check1(test, 'J')) || check1(test, 'H');} /* 如果I、J都不参加,H必须参加 */
int main(void)
{
int i;
for (i = 1; i <= 0x3FF; i++)
if (t0(i) && t1(i) && t2(i) && t3(i) && t4(i) && t5(i) && t6(i) && t7(i) && t8(i) && t9(i))
print(i);
return 0;
}
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
用位标致来建立解空间,遍历所有情况判断条件输出。
[
本帖最后由 lz1091914999 于 2011-9-14 09:53 编辑 ]