题目要求:

第四次作业,构造一个方阵将指定单词填入

stage 1:每个单词只出现1次,且八个方向各至少有两个单词

stage 2:矩阵长宽相等

stage 3:方阵的四个角都要参与单词的构建

算法思路:

课上将这个题的时候我和薛大神讨论了一下,通过研读样例,我们认为大部分单词都是斜着填进方阵的,所以我们在用8个单词构造好边框后,将剩下单词按照四种对角线的方向依次填入,最后再扫一遍矩阵将矩阵压缩就好.但是这种方法无法满足长宽相等的条件.

前天想了一个简单粗糙的方法,虽然能够满足题目的所有要求,但是构造的方阵缺少美感,尤其是在我刚刚看了肖犇犇和鲁大师的博客之后,突然感受到了这个世界深深的恶意...

先按照如图所示在左上角构造两条对角线,覆盖了8个单词,4种对角线方向(可以简单的将单词逆序来实现)

注意在插入第二条对角线的时候需要判断第一条对角线的长度为奇数还是偶数,如果是奇数那么就需要+1(来保证已经构造的满足长=宽),同时标记变量flag=true,mark用来标记空出的这一列

然后根据单词总数的奇偶,分别剩下两个或者三个单词来进行特判

不进行特判的单词就一横一竖插入就好(同样简单的用逆序来实现方向不同)

如果总数为奇数,那么就剩下3个单词特判,如果flag=true,先将一个单词放入mark列,再将剩余两个单词放入右下角(为了满足四个角都在单词中);如果flag=false,那么将两个单词按照以前的方式一横一竖放入,最后一个单词放入右下角

如果总数为偶数,那么就剩下2个单词特判,如果flag=true,先将一个单词放入mark列,再将最后一个单词放入右下角;如果flag=false,那么就将这两个单词都放入右下角

这样,我们就满足了各个方向都》=2,矩阵长=宽,四个角都在单词中的条件,为了满足每个单词只出现一次的条件,我们认为这是小概率条件,全放单一字母就好(例如放辅音字母),当然还可以暴力放入后暴搜判断是否满足条件.

有一点需要注意的是,开始构造8个单词的对角线时,为了放置后续单词放入时交叉,我们选择每条对角线有一个最长的单词;同时为了满足矩阵尽量小,我们将总体的单词按照长度从小到大排序

最后为了展示效果好一点,做了一点点美工,设计了UI。

后来我们觉得这个方法有点挫...

有搞了另外一个方法,算法是这样:

通过遍历单词表进行深搜。
搜索之前预留3个单词满足题目条件。
搜索的过程中记录当前矩阵的长宽边界。
对于当前搜索的单词,我们枚举它能摆放的位置和方向(起始位置处于当前矩阵长宽边界内)。
如果当前的摆放使原本长宽的长度差增加,则不这么摆。
当枚举完最后一个单词时,判断当前长宽边界,如果相等,则完成搜索。
最后将预留的3个单词加入左下,右下,右上角(左上角必然有词)。

效果是这样

  Personal Software Process Stages 时间百分比(%)  实际花费的时间 (分钟) 原来估计的时间 (分钟)
Planning 计划 2.0  45            60 
·         Estimate  ·         估计这个任务需要多少时间,把工作细化并大致排序 2.0  45 60 
Development 开发 88.7  2000  1500
·         Analysis  ·         需求分析 (包括学习新技术) 2.7  60  60
·         Design Spec ·         生成设计文档   0  0
·         Design Review ·         设计复审 (和同事审核设计文档) 0  0  0
·         Coding Standard ·         代码规范 (制定合适的规范) 5.3  120  60
·         Design ·         具体设计 5.3  120  60
·         Coding ·         具体编码 62.1  1400  1200
·         Code Review ·         代码复审 10.6  240  60
·         Test ·         测试(自我们测试,修改代码,提交修改) 2.7  60  60
Reporting 总结报告 9.3  210  60
·         Test Report ·         测试报告 5.3  120  0
·         Size Measurement ·         计算工作量 1.3  30  0
·         Postmortem & Improvement Plan ·         事后总结, 并提出改进 2.7  60  60
Total 总计 100% 总用时 总估计的用时
       2255  1260

现代程序设计 homework-04的更多相关文章

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

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

  2. 标准C程序设计七---04

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  3. 小兔JS教程(四)-- 彻底攻略JS数组

    在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...

  4. nVIDIA SDK White Paper ----Vertex Texture Fetch Water

    http://blog.csdn.net/soilwork/article/details/713842 nVIDIA SDK White Paper ----Vertex Texture Fetch ...

  5. 小兔JS教程(五) 简单易懂的JSON入门

    上一节的参考答案: http://xiaotublog.com/demo.html?path=homework/04/index2 本节重点来介绍一下JSON,JSON(JavaScript Obje ...

  6. 软工+C(9): 助教指南,持续更新...

    上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...

  7. 20145218 《Java程序设计》第04次实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.22 实验名称:Android开发基础 一.实验内容 1.基于Android ...

  8. [连载]Java程序设计(04)---任务驱动的方法:工资结算系统

    任务:或在公司,该公司将其分为三类人员:部门经理.销售员.在发工资的时候,部门经理拿固定月薪8000元.技术人员按每小时100元领取月薪.销售人员依照500元底薪加当月销售额的4%进行提成.设计并实现 ...

  9. 20172319 2018.04.01-04.11 《Java程序设计》第5周学习总结

    20172319 2018.04.01-04.11 <Java程序设计>第5周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错 ...

  10. 20172319 2018.04.11-16 《Java程序设计教程》 第6周学习总结

    20172319 2018.04.11-16 <Java程序设计教程>第6周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题 ...

随机推荐

  1. hive学习笔记——表的基本的操作

    1.hive的数据加载方式 1.1.load data 这中方式一般用于初始化的时候 load data [local] inpath '...' [overwrite] into table t1 ...

  2. 转 intent常用功能

    1.从google搜索内容Intent intent = new Intent();intent.setAction(Intent.ACTION_WEB_SEARCH);intent.putExtra ...

  3. LeetCode Contains Duplicate (判断重复元素)

    题意: 如果所给序列的元素不是唯一的,则返回true,否则false. 思路: 哈希map解决. class Solution { public: bool containsDuplicate(vec ...

  4. zoj 1842 Prime Distance

    // 数论题,增强的筛法,回想素数筛法 // 只要筛到最大数的开方,剩下的就是素数 // 于是这里,开一个 sqrt(2^31) 大约 65536 的素数表,然后 // 对于每个 L~U 的区间,筛掉 ...

  5. <一>SQL优化1-4

    第一条:去除在谓词列上编写的任何标量函数        --->在select 显示列上使用标量函数是可以的.但在where语句后的过滤条件部分对列使用函数,需要考虑.因为执行sql的引擎会因为 ...

  6. 多线程程序设计学习(3)immutable pattern模式

    Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个 ...

  7. 用命令行(CMD)中启动和关闭ORACLE服务

    lsnrctl start开启监听 lsnrctl stop停止监听 net start oracleserviceoracle开启oracle服务 net stop oracleserviceora ...

  8. tcprstat的使用方式

    两种使用方式:1)本机直接在线采集:2)分析tcpdump采集到的离线pcap文件   1. 本机直接在线采集 参数:   -p :指定只采集此TCP port的请求   -t  : 采集输出的时间间 ...

  9. UI篇--android实现底部按钮布局

    1.采用LinearLayout布局: <LinearLayout android:id="@+id/main" android:layout_width="fil ...

  10. 陈发树云南白药股权败诉真相 取胜仅差三步 z

    22亿元现金,三年只拿到750多万元的利息.福建富豪陈发树的云南生意可谓失望之极.在漫长的官司中,曾经有绝处逢生之机的陈发树,连告状的主体都没有找准,岂能同强大的国企扳手腕?陈发树律师团距取胜只有三步 ...