现代程序设计homework——04

题目:

  详见:http://www.cnblogs.com/xinz/p/3341551.html

  题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话。确实,题目真心不简单,放在那半个多月都没有什么好的想法,直到听了这个大牛的讲解,我明智地选择了简单粗暴的做法。为了满足这个题目的三个要求,不择手段了一把,不过把代码搞得大量重复,满篇都是for的感觉确实不怎么样。

思路:

  我和我的小伙伴儿是这么想的,尽量让更多、更长的单词对角放置是比较明智的,把一个矩阵看成一个国际象棋的棋盘,两条对角线方向的单词分别只占用黑色或者白色的地方。于是,一个很暴力的遍历就产生了。四种对角方向轮流分别按照行列的顺序进行搜索,找到自己能放置的位置之后,果断占据。(出乎意料,如果全部按照这样操作,效果非常好,几乎没有几个地方是空着的。)然而,我们需要每个方向都有两个单词,于是,留下8个单词进行横平竖直的摆放,同时,尽量将其调整成一个正方形。

  尽管我的对角插入方法可以满足矩阵长宽之间差距不大于最后插入的单词的长度,我依旧可以制造出特别***钻的样例,然八个单词制造不出正方形的矩阵。我想了很久,尝试了几种方法,当我想要使得我能处理的范围扩大一点点时,我的代码量是要成倍增加的,用我小火把的话说:“还不如用无脑的方法”。于是,我就用了无脑的方法。(经过几轮测试,好像正常一点儿的样例都可以无脑解决的)。

  对于空白的填补,我本打算用词频统计的升序来填的,这样弄的后果是所有的空白几乎都被“j”占据了。于是,我们采用了随机值,如果出现冲突,则选择出现概率更小的值来替换。如果最小的还是冲突则循环,如果点儿背到26个字母都冲突,我们就空着那个点。每次填入一个词,我们进行一下冲突检查,这个工作是我的小伙伴儿做的。

源码:

  此处略去n*100行,代码写得太丑了,好多重复,好多for……

效果:

test1

 题目: 答案:

test2:

题目:

答案:

感受:

  我信誓旦旦地认为我可以按时完成作业,结果我又错了……好消息是,前三次作业欠的债还了一个。

表格:

分析 0.5h
设计 3+2h
编码 >=7.5h

posted on 2013-10-28 18:15  hennande  阅读(210)  评论(0编辑  收藏  举报

导航