题目要求:

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

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. AngularJS小试牛刀

    总看别人说argularjs,knockoutjs,mvvm模式这些,光看不练假把式,于是便在自己的一个小网站上做了个简单的页面应用了下argularjs ,详细地址见 http://www.591j ...

  2. 通过ajax访问aspx的CodeBehind中的方法

    引言 在项目中突然看到,aspx中的ajax可以访问aspx.cs中的方法,觉得很新奇,也许是lz少见多怪,不过,真的有发现新大陆似的那种兴奋,你也许知道这代表什么,学会了这种方式,代表你以后,可以建 ...

  3. MVC中使用WebMail 发送注册验证信息

    在MVC中发送Email 可以使用WebMail :使用起来十分简单.如下: WebMail.SmtpServer = ConfigurationHelper.GetValue("SmtpS ...

  4. cocos基础教程(13)使用Physicals代替Box2D和chipmunk

    1.   概述 游戏中模拟真实的世界是个比较麻烦的事情,通常这种事情都是交给物理引擎来做.首屈一指的是Box2D了,它几乎能模拟所有的物理效果.而chipmunk则是个更轻量的引擎,能够满足简单的物理 ...

  5. cocos基础教程(11)事件分发机制

    cocos3.0的事件分发机制: 创建一个事件监听器-用来实现各种触发后的逻辑. 事件监听器添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种 ...

  6. IP欺骗使用

    一.为什么要设置IP欺骗 1. 当某个IP的访问过于频繁,或者访问量过大时,服务器会拒绝访问请求,这时候通过IP欺骗可以增加访问频率和访问量,以达到压力测试的效果. 2. 某些服务器配置了负载均衡,使 ...

  7. 新浪云php与java连接MySQL数据库

    PHP新浪云连接MySQL <?php $con=mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYS ...

  8. SpringMVC配置easyui-datagrid

    SprimgMVC的UserController.java @RequestMapping(value = "listUserForJson") @ResponseBody pub ...

  9. centos安装redis及php-redis扩展

    centos安装redis及php-redis扩展  Linux, WEB 七162012 今天公司同事要求在测试机上安装redis,并且要求让php安装上redis的扩展,redis是一个key-v ...

  10. 【leetcode】Longest Consecutive Sequence

    Longest Consecutive Sequence Given an unsorted array of integers, find the length of the longest con ...