作业4

一.思路

需求:最大的难点在于如何保证每个方向出现2次以上,以及宽度和高度保持一致,四个角都有单词。
初步设计:对表中的每一个词,根据添加策略找到合适的位置,加入表中,不能找到则回溯,直到找到这样一个表为止。
具体设计:两个类,第一个类:CrossWord,要填入的单词;第二个类:CharGrid,要实现的表,主要方法是fill(填表)。

而填表策略则是

假设a是要填入的单词,b是已经填入的单词,则有三个检查条件

1)检查a中的首字母与b中的所有字母是否有一个匹配,如果满足进入条件2;

def find_overlap cw, testword
    return nil if testword.unplaced?
    if (offset = testword.word.index cw.word[0])
      startpt = testword.place
      offset.times{startpt=nextp(startpt,testword.dir)}
    else
      startpt = nil
    end
    startpt
  end

2)以任意一个方向,检查如果添加a进入表中是否能够满足表中已有的字母;

3)若是a中与b中所有字母都不能进行匹配,那么a的起始位置为随机,方向也为随机。

def test_place cw, suggestion=nil
    dir=randDir
    start= suggestion || randStart(cw.word[0])
    8.times do
      pt = start
      good = true
      cw.word.each_byte{|chr|
        good = (@g[pt]==?. ||  @g[pt]==chr) && (pt=nextp(pt,dir))
        break unless good
      }
      return add(cw, start, dir) if good
      dir=(dir+1)%8
    end
    nil
  end

事实上如果要优化这个word search生成器的话,就是优化这个填表策略。现在这种策略两个单词之间只有少量交叉,我们还可以改写成一个都不交叉的情况。

二.心得

要说心得的话,就是这道题太难了,简直爽歪歪。我在网站上有看到许多word search puzzle生成器之类的,只能看到结果,但是看不到生成器的代码。

有两点要说:

1)上次做最大连续子数组的时候是人把一部分问题解决,交给计算机处理,复杂度降低;在这次这道题目中,是把所有东西都堆给计算机,随机随机,电脑你就慢慢算吧,我歇一边了;

2)队友给力:-)

三.效率分析

捕获

四.效果截图

posted on 2013-10-26 22:49  mountainking  阅读(173)  评论(0编辑  收藏  举报