zoukankan      html  css  js  c++  java
  • 作业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)队友给力:-)

    三.效率分析

    捕获

    四.效果截图

  • 相关阅读:
    keras环境搭建
    通过程序自动设置网卡的“internet共享”选项
    编译pjsip源码
    电商开发必备,淘宝商品和类目体系是如何设计的
    pom.xml成了普通xml文件
    springboot application.properties不生效
    SpringBoot进阶教程(七十二)整合Apollo
    SpringBoot进阶教程(七十一)详解Prometheus+Grafana
    SpringBoot进阶教程(七十)SkyWalking
    Java8 lamda表达式
  • 原文地址:https://www.cnblogs.com/mountainking/p/3390113.html
Copyright © 2011-2022 走看看