题目要求:

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

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. socklen_t在windows和linux平台下的头文件定义

    windows平台下:头文件:#include<ws2tcpip.h> linux平台下:下面两个头文件都有定义:1)#include <sys/socket.h>2)#inc ...

  2. POJ 1707 Sum of powers(伯努利数)

    题目链接:http://poj.org/problem?id=1707 题意:给出n 在M为正整数且尽量小的前提下,使得n的系数均为整数. 思路: i64 Gcd(i64 x,i64 y) { if( ...

  3. Android_PendingIntent的使用

        PendingIntent介绍 PendingIntent可以看作是对Intent的一个封装,但它不是立刻执行某个行为,而是满足某些条件或触发某些事件后才执行指定的行为. PendingInt ...

  4. C# 实现对接电信交费易自动缴费

    他有这样一个JS PassGuardCtrl.js 部分代码    1 defaults:{  2             obj:null,  3             random:null,/ ...

  5. Windows SDK 实现不规则窗口介绍

    不规则窗口在程序界面设计中能提供非常好的用户体验,以下是我程序运行时的效果图: 以下是代码,注意需要修改一些简单的位置,如资源ID,项目的头文件等,这些是根据你创建的win32程序的项目名改变的,我的 ...

  6. Android+Eclipse+Java:在“正在启动 CrazySnake”期间发生了内部错误, java.lang.NullPointerException

    删除工作空间下的.metadata 文件夹 重启 Eclipse 清理工作空间

  7. Java知识点:琐碎知识点(3)

    零碎 switch(x),x只可以是enum或byte.short.char.int. 枚举在switch-case语句作为标签时必须是枚举常量的非限定名称,否则Compile Error. Enum ...

  8. LeetCode: JumpGame 1 and 2

    Title : Given an array of non-negative integers, you are initially positioned at the first index of ...

  9. NYOJ-779-兰州烧饼

    [题目链接:NYOJ-779] 兰州烧饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 烧饼有两面,要做好一个兰州烧饼,要两面都弄热.当然,一次只能弄一个的话,效率 ...

  10. Using Open Source Static Libraries in Xcode 4

    Using Open Source Static Libraries in Xcode 4 Xcode 4.0.1 allows us to more easily create and use th ...