谁养鱼----让人郁闷的穷举

先贴这里,待处理.不妨参考这里建模处理问题的方法.

穷举的速度比用笔还慢,郁闷这题昰爱因斯坦在20世纪初出的谜语,他说世界上有百分之98的人答不出来.你能答出来吗?
请写出分析过程.
1.在一条街上,有5座房子,喷了5种颜色.
2.每个房子里住着不同国籍的人.
3.每个人喝着不同的饮料,抽不同品牌的香烟,养不同的宠物

提示:
1.英国人住红色房子.
2.瑞典人养狗.
3.丹麦人喝茶.
4.绿色房子在白色房子左边.
5.绿色房子主人喝咖啡.
6.抽pall mall香烟的人养鸟.
7.黄色房子主人抽dunhill香烟.
8.住在中间房子的人喝牛奶.
9.挪威人住第一间房.
10.抽blends香烟的人住在养猫的人隔壁.
11.养马的人住抽dunhill香烟的人隔壁.
12.抽blue master的人喝啤酒.
13.德国人抽prince香烟.
14.挪威人住蓝色房子隔壁.
15.抽blends香烟的人有一个喝水的邻居。 

C/C++ code
    
    
#include < stdio.h > #include < stdbool.h > const char * a[ 5 ] = { " 英国人 " , " 瑞典人 " , " 丹麦人 " , " 挪威人 " , " 德国人 " }; const char * b[ 5 ] = { " " , " " , " " , " " , " " }; const char * c[ 5 ] = { " 红色 " , " 绿色 " , " 白色 " , " 黄色 " , " 蓝色 " }; const char * d[ 5 ] = { " " , " 咖啡 " , " 牛奶 " , " 啤酒 " , " " }; const char * e[ 5 ] = { " pail mall " , " dunhill " , " blends " , " blue master " , " prince " }; void sc( int i, int j, int m[i][j]); bool pd( int i, int j, int m[i][j], int A, int B, int C, int D, int E); int main() { int m[ 120 ][ 5 ] = { 0 }; sc( 120 , 5 , m); int flag = - 1 ; int temp; int A, B, C, D, E; for (A = 0 ; A < 120 ; ++ A) { for (B = 0 ; B < 120 ; ++ B) { for (C = 0 ; C < 120 ; ++ C) { for (D = 0 ; D < 120 ; ++ D) { for (E = 0 ; E < 120 ; ++ E) { temp = ((m[A][ 0 ] == m[B][ 4 ]) * 1 + (m[A][ 1 ] == m[B][ 4 ]) * 2 + (m[A][ 2 ] == m[B][ 4 ]) * 3 + (m[A][ 3 ] == m[B][ 4 ]) * 4 + (m[A][ 4 ] == m[B][ 4 ]) * 5 - 1 ) % 5 ; flag = flag == - 2 ? - 2 : (pd( 120 , 5 ,m,A,B,C,D,E) ? (flag == - 1 ? (temp) : (temp == flag ? flag : - 2 )) : flag ); } } } } } switch (flag) { case - 2 : printf( " 穷举中出现了冲突情况 " ); break ; case - 1 : printf( " 没找到解 " ); break ; default : printf ( " %s养鱼 " , a[flag]); } return 0 ; } void sc( int i, int j, int m[i][j]) { int a,b,c,d,e,f,g; int x = 0 ; for ( a = 0 ; a < 5 ; ++ a) { for (b = 0 ; b < 5 ; ++ b) { if (b == a) continue ; for (c = 0 ; c < 5 ; ++ c) { if (c == a || c == b) continue ; for (d = 0 ; d < 5 ; ++ d) { if (d == a || d == b || d == c) continue ; m[x][ 0 ] = a; m[x][ 1 ] = b; m[x][ 2 ] = c; m[x][ 3 ] = d; m[x][ 4 ] = 10 - a - b - c - d; ++ x; } } } } } bool pd( int i, int j, int m[i][j], int A, int B, int C, int D, int E) { if (m[A][ 0 ] == m[C][ 0 ] && m[A][ 1 ] == m[B][ 1 ] && m[A][ 2 ] == m[D][ 0 ] && m[C][ 1 ] + 1 == m[C][ 2 ] && m[C][ 1 ] == m[D][ 1 ] && m[E][ 0 ] == m[B][ 2 ] && m[C][ 3 ] == m[E][ 1 ] && m[D][ 2 ] == 2 && m[A][ 3 ] == 0 && (m[B][ 0 ] + 1 == m[E][ 2 ] || m[B][ 0 ] - 1 == m[E][ 2 ]) && (m[E][ 1 ] + 1 == m[B][ 3 ] || m[E][ 1 ] - 1 == m[B][ 3 ]) && m[E][ 3 ] == m[D][ 3 ] && m[A][ 4 ] == m[E][ 4 ] && (m[C][ 4 ] + 1 == m[A][ 3 ] || m[C][ 4 ] - 1 == m[A][ 3 ]) && (m[E][ 2 ] + 1 == m[D][ 4 ] || m[E][ 2 ] - 1 == m[D][ 4 ]) ) return true ; return false ; }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值