零、准备工作

  这次的作业仍然是结对编程,我们队伍的成员为:梁杰、夏天晗、谢祖三。上次我们是选择了一个时间大家聚在一起进行编程,效果不错,所以这次我们还是决定采用这种方式。由于大家平时比较忙,这周六日我又有事,所以最后决定周五晚上大家一起进行编程。

  周五晚上吃完饭,我们就开始了讨论。

  这次最大的一个改变就是语言。

  上次我们使用的是Python,是因为我和夏天晗对Python比较熟悉,并且夏天晗的第2次作业比较好,所以决定使用Python。

  这次作业,因为我们三个都选了一门Ruby课程,也都想挑战一下自己,所以我们决定使用Ruby来进行编写。

  语言决定了,下面就是分工了。因为上次主要是我和夏天晗同学进行代码编写,谢祖三同学主要进行代码复审,所以这次我们决定换一下角色,由谢祖三同学担任主要部分的代码编写,我和夏天晗同学负责数据读入、结果输出、解法输出、代码复审等辅助工作。

  分工之后,我们就正式开始了关于题目的讨论。

一、具体思路

  第4次作业我们开始的时候并没有很好的思路,所以上周一直没有做。这周上课时候听了亚研院一位老师的方法,感觉有一些启发。老师的方法主要是深度优先搜索,我们决定在这个思路上进行思考。

  难点1:深度优先搜索起始点的选择

  深度优先搜索需要一个根节点,也就是起始点。我们认为起始点的选择是非常重要的,因为深度优先搜索需要进行回溯,所以节点的错误选择出现的越早,对性能的影响越大。也就是说如果根节点选错了,需要一直回溯到根节点才能继续寻找正确答案。而根节点的选择方法,经过我们的激烈讨论,觉得最好的方法就是随机选择。因为我们无法通过一些有效的办法来选择起始点,比如按照单词长度或者重复率等等,所以最终我们决定采用随机方法来选定根节点,达到平均效率最高。

  难点2:深度优先搜索过程中下一步节点的选择

  这个问题和第一个问题很相近,所以我们同样决定采用随机方法进行测试。

  难点3:如何防止卡死

  我们的搜索方法是结合随机和深搜的方法,所以可能会出现在一个小范围内一直循环的问题,也就是卡死。为了解决这种问题,我们采用了一种比较折衷的解决办法,就是当搜索在一定范围内循环次数超过阈值时,随机从矩阵中删除一些已有单词,来解除卡死。

  

  难点4:如何判断结果是否正确

  题目的要求很多,比如单词不能重复,四角必须有单词等等。当我们进行测试的时候,怎么判断结果是否正确成了一个大问题。为了解决这个问题,我们最终决定编写一个解题函数并用可视化的方法显示出来,这样就可以直观的判断是否满足要求。运行代码之后生成的solution.txt文件就是解法

二、实际编写

   讨论出思路之后,我们就开始了实际编写代码。虽然之前思路和分工都已经很明确了,但是编写起来并不轻松,因为我们对Ruby都不算很熟悉,所以编写过程中经常遇到一些小问题。不过因为我们是一起编写的,所以一旦遇到问题大家就会马上讨论,三个臭皮匠顶个诸葛亮嘛!在我们的不断讨论和搜索之后问题往往都能被很快解决。上次编写代码时夏天晗同学的变量命名习惯并不是很好,这次有了明显的改变,代码可读性提高了很多。

三、测试功能

  我们选择的测试方法是人工测试。因为我们编写了生成解法的函数,所以可以直接查看解法来判断是否正确。测试过程如下:

  

  首先我们来运行一下程序,因为一开始并不知道矩阵大小,所以我们先尝试一下20x20(单词就不在这里列出了,可以查看allwords.txt文件):

$ ruby homework04.rb allwords.txt 20x20

  

  可以看到很快就运行出了结果,我们查看一下solution.txt:

  

  可以看到满足了题目要求。

  因为运行速度非常快,所以我们考虑可能20x20有点大,下面我们尝试一下16x16:

  

  

  可以看到程序一直在尝试放置单词,但是有十几个单词一直放不进去,说明矩阵尺寸太小了。

  

  再尝试一下17和18(这里不截图了,和上面的差不多),我们发现18x18的时候矩阵可以出结果,说明最小矩阵就是18x18了。   

  

  当然,矩阵并不一定要是nxn,你也可以使用nxm,如果矩阵的长宽无法放入最长的单词会提示出错。

 

四、总结

  这是我们第二次结对编程,大家表现比上次好了很多,虽然使用了一个新语言,遇到很多问题,但是我们没有退缩,仍然完成了作业。

  我们的作业经过测试,可以满足老师提出的要求:8方向,无重复,四角有单词,矩阵最小。我们甚至还编写了一个生成可视化解法的函数,让检测结果正确性变得非常简单。

五、时间统计

Personal Software Process Stages

时间百分比(%)

实际花费的时间 (分钟)

原来估计的时间 (分钟)

计划

 10%  18    12

·         估计这个任务需要多少时间,把工作细化并大致排序

 10%  18  12

开发

 85%  153  102

·         需求分析 (包括学习新技术)

 15%  27  18

·         设计复审 (和同事审核设计文档)

 10%  18  12

·         代码规范 (制定合适的规范)

 5%  9  6

·         具体设计

 10%  18  12

·         具体编码

 35%  63  42

·         代码复审

 5%  9 6

·         测试(自我测试,修改代码,提交修改)

 5%  9 6

总结报告

 5%  9  6
总计 100% 总用时  180
总估计的用时 120

[课程相关]homework-04的更多相关文章

  1. 【学习笔记】B站-2019-NLP(自然语言处理)之 BERT 课程 -- 相关课程笔记

    BERT 课程笔记 1. 传统方案遇到的问题 BERT的核心在于Transformer,Transformer就类似seq2seq网络输入输出之间的网络结构. 传统的RNN网络:最大的问题,因为不能并 ...

  2. Linux及安全课程——相关链接总结

    附录:学习笔记链接总结 MOOC课程学习笔记与实验: 第一周:计算机是如何工作的 第二周:操作系统是怎么工作的 -- 一个简单的时间片轮转多道程序内核代码及分析 第三周:构造一个简单的Linux系统M ...

  3. [课程相关]homework-02

    一.如何组织代码 因为这个代码比较简单,用函数就足够了,个人觉得没必要用类,杀鸡不必用牛刀. 代码有点长,主要是加了很多判断参数的部分. 提取了一个公共的递归函数. 用了不少全局变量,可能当做参数传入 ...

  4. 潭州课堂25班:Ph201805201 django 项目 第四十二课 后台 课程相关,用户组管理 (课堂笔记)

    在线课程: 当点击进入页面时,显示所有课程 def get(self, request): courses = Course.objects.select_related('category', 't ...

  5. [课程相关]附加题——stack的理解

    一.stack的三种解释 stack有三种解释,我个人理解如下. 1.用户自定义的stack 用户自定义的stack就是一般意义上的后进先出队列,从名字上就能理解了,stack由下向上增长,有一个顶指 ...

  6. [课程相关]homework-09

    零.前言 这次的作业比较特殊,有两种做法.由于我对网页很熟悉,所以选择网页. 细节不赘述,下面写一下这次作业的几个亮点. 一.亮点 最大的亮点就是这个页面是纯客户端的,没有服务端.也就是说所有功能都是 ...

  7. [课程相关]homework-06

    一.c++11 lambda /* * File: main.cpp * Author: liangjie * * Created on 2013年11月23日, 下午12:02 */ #includ ...

  8. 现代程序设计homework——04

    题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...

  9. [课程相关]homework-08

    一.变量作用域和生命周期 #include <cstdlib> #include <iostream> using namespace std; void try_change ...

随机推荐

  1. 设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)

    本文出自 代码大湿 代码大湿 本系列持续更新,敬请关注. 1 静态工厂 静态工厂介绍: 静态工厂模式可以实现接口封装隔离的原则.在客户端只知接口而不知实现的时候可以使用静态工厂模式. 源码请点击我 角 ...

  2. erlang局域网内节点通信——艰难四步曲 (转)

    http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...

  3. mysqldump造成Buffer Pool污染的研究

    前言: 最近Oracle MySQL在其官方Blog上贴出了 5.6中一些变量默认值的修改.其中innodb_old_blocks_time 的默认值从0替换成了1000(即1s) 关于该参数的作用摘 ...

  4. POJ2763-Housewife Wind(树链剖分)

    也是入门题,和上一题不一样的是权值在边上. 调了半天后来发现线段树写错了,build的时候没有pushup...蠢哭了好吗.... 做题还是不专心,太慢辣.. #include <algorit ...

  5. work_8

    1.把程序编译通过, 跑起来. 读懂程序,在你觉得比较难懂的地方加上一些注释,这样大家就能比较容易地了解这些程序在干什么. 把正确的 playPrev(GoMove) 的方法给实现了. 如果大家不会下 ...

  6. Hibernate检索策略

    1. Hibernate的检索策略概述: 检索数据时的 2 个问题:    1.不浪费内存:当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象 ...

  7. Jvm基础(1)-Java运行时数据区

    最近在看<深入理解Java虚拟机>,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此.这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出. 首先把图贴上来 ...

  8. 在JS和.NET中使用JSON (以及使用Linq to JSON定制JSON数据)

    转载原地址: http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html 阅读目录 JSON的两种结构 认识JSON字符串 在JS中如 ...

  9. JMS开发(一):基础理论认知

    JMS全称是Java Message Service.其是JavaEE技术规范中的一个重要组成部分,是一种企业消息处理的规范.它的作用就像一个智能交换机,它负责路由分布式应用中各个组件所发出的消息. ...

  10. JS与Jquery的事件委托——解决了绑定相同事件的问题

    概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完 ...