设计模式 —— “积分模式”


0.简介

        很多设计模式的教程都是从Factory模式讲起的,例如我最爱的《大话设计模式》。但是在这里我先要介绍一下“积分模式”,这是我在解决爱因斯坦大难题时用到的方法,觉得确实是一种编程的思路,就分享一下吧。


1.“爱因斯坦大难题”

        究竟什么是爱因斯坦大难题呢?听起来好像很高级,其实与相对论无关,也叫Zebra Puzzle,就是我们都玩过的数学智力游戏,题目如下:

有五个不同国籍的人居住在五幢不同颜色的房子,他们各有自己不同的心爱的动物(如马,斑马,狗等)喝不同的饮料,和抽不同的香烟。现在已知:
1 英国人住在红房子里。
2 西班牙人喜欢养狗。
3 绿房子的主人喜欢喝咖啡。
4 乌克兰人喜欢喝茶。
5 绿房子在白房子的右边。(从读者的方向看,以下相同)
6 抽“万宝路”牌香烟的人养蜗牛。
7 黄房子的主人抽“可乐”牌香烟。
8 当中那幢房子的主人喝牛奶。
9 挪威人住在左边第一幢房子。
10 抽“本生”牌香烟的人和养狐狸的人是隔壁邻居。
11 抽“可乐”牌香烟的人和养马的人是隔壁邻居。
12 抽“肯特”牌香烟的人喝橘子水。
13 日本人抽“摩尔”牌香烟。
14 挪威人和蓝房子的主人是隔壁邻居
从以上的14重情况判断:谁是喝水的人?谁是养斑马的人?


2.解决办法

       手工做:我用的是国外网上介绍的Shrinking Table(应该译作收缩表吧),两个小时可以"缩"出来。

       编程解决:我也是用了两个小时来编程,就是用到了积分模式(这里插一句,我用排列算法穷举了所有情况,大遍历了三千亿次循环,结果在Linux下最优编译跑了20分钟,Windows下跑了半个小时后死机)。


3.积分模式

       唉,废话太多了(这里又一句),讲讲编程思路吧。

       因为每次对以上14种情况都要判断,而且每次都至少有几种条件符合,然后穷举出来的两种情况前后又不能互相干扰。所以我在每次判断是否为解前(即是否同时满足14种条件),设置了个score变量,进入判断时若条件满score++,最后判断如果score为14则为正解,否则重置为0继续遍历(很简单吧,我也不知道这算不算一种designpattern,但是当时能想到用这个觉得还是挺不错的,就一思路而已)。

       欢迎拍砖啊~~



已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页