问题描述

  本次作业的题目要求利用给定的一组单词生成一个矩阵,矩阵的每个位置由一个字母填充,单词表中的每一个单词可以匹配矩阵中一段连续的序列,这段序列可以是横向,纵向或者是45度斜角方向,单词可以由左向友匹配,也可以逆向匹配。题目将生成的矩阵分为3个等级,任意一个等级要求满足前一级所有要求。第一级要求每个方向上至少出现两个单词,总共四个方向,矩阵横纵规模可以不等,每个单词在矩阵中仅能被覆盖一次,不能存在一行或一列不被任何短语覆盖;第二级要求矩阵横纵相等;第三级要求四个角必须被覆盖。最后返回的矩阵期望能有尽可能小的规模。

问题分析

  题目第一眼看上去非常困难,实际上也非常困难,形式上看三级要求应该是难度逐级递增的,但稍加分析我们就会发现实际上,第三级和第二级的要求很好满足,第三级只要开始的时候在四个角填上单词即可, 除非算法太过灵动,否则完全可以将新矩阵看成一个有限制条件的矩阵,对题目影响很小,而第二级要求则更容易满足,但第二级要求与第一级联系很紧,直接讨论第一级要求,每个方向上至少出现两个单词,这个要求要求单词列表中至少有8个单词,如果单词表元素太少,那么这条要求就对程序要求非常苛刻,设计者协调最优性和合法性的难度相当的大,每个单词仅能覆盖一次,对于这个要求而言,如果单词表中存在一定规模的短单词,如at,in,on,into,to,保证这条要求可能需要耗费大量的资源,对于into,to而言实际上只能覆盖into,而对于banana,an而言就不能保证合法性了;对于每一行每一列都必须被覆盖而言,则可以通过填满对角线来容易的保证。

解题思路

  开始思考解题方案时,如果填入一个单词进去,另一个单词和其重叠填充的话就能更好的利用空间,但同时存在另一个问题,如果填充一个单词在某个位置必须符合大量已经填过的词的限制,那么必然导致效率低下, 且有很大可能难以填充,但填充单词做到效率尽可能快重叠尽可能高显然是不现实的。为了处理这个矛盾,我们采用了这样一种方式,在填充初期,尽量避免限制,在后期尽量实现重叠。矩阵上有这样一个性质,如果我们对矩阵奇偶染色生成棋盘,那么在斜线上奇偶是互不相交的。

  如果将其旋转45度,就会得到上图效果,仅考虑斜着放的情况的话,在奇数格子填充单词时不会影响偶数格子的,因此我们的实现在一开始先将矩阵奇偶染色,旋转45度后生成新矩阵,分别在两个矩阵中进行填充,然后再组合起来再在原矩阵总进行纵向和横向的填充。

  在上次课程,我们又得到了新的启发,如果一开始填一个很长的单词并以纵向的方式填在原矩阵中,它会对每一个方向上的填充都造成一个限制,但这个限制非常弱,很容易满足,这样可以解决一些长单词的填充问题,同样我们再旋转过后的子矩阵中采用同样的策略,这样有非常有利于将长单词放在尽量小的矩阵中。同时我们也注意到,如果一开始放两个同向的单词效果就大打折扣了,原先匹配的可能有26种,而放了两个之后可能就迅速飙升到了26*26种,因此放置一个应该是一个非常合适的选择。正因为短的单词更容易匹配,因而我们将单词按长度排序,在运行初期尽可能使用长的单词,以保证后期能更容易的匹配。原先测试上课提供的样例时我们的程序仅能生成20*20的方阵,在加入这项优化后,就可以跑出19*19的方阵。

一些细节

  在保证四个角都有单词时我们讨论了两种方案,一是在算法初期就在四个角填充一个单词,二是在算法结束前在四个角填充一个单词,实践上这两种方案对程序影响非常小。

  在进行空余格子填充时,我们采用填充辅音字母的策略,后来继而改进采取又去掉了填充的常见辅音字母。

个人开发进程

阶段  估计用时 实际用时 
 用时估计   5h     6h
 代码规范  0.5  0.5
 具体设计  0.5  1
 具体编码  2.5  3
 代码复审  0.5  1
 代码测试  0.5  0.5

  

homework-04 单词方阵的更多相关文章

  1. 洛谷 P1101 单词方阵

    题目链接 https://www.luogu.org/problemnew/show/P1101 题目描述 给一n×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中 ...

  2. 洛谷P1101 单词方阵——S.B.S.

    题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red ...

  3. 单词方阵 洛谷 P1101

    题目描述 给一nXn的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间 ...

  4. P1101 单词方阵 简单dfs

    题目描述 给一n \times nn×n的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单 ...

  5. 洛谷1101:单词方阵(DFS)

    题目描述 给一n×nn \times nn×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着888个方向的任一方向,同一单词摆放 ...

  6. 洛谷P1101 单词方阵【暴力】【字符串】

    题目描述 给一n×nn \times nn×n的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 888 个方向的任一方向,同一单词摆放时不再改变方向, ...

  7. 【洛谷P1101】单词方阵

    题目大意:给一 \(n \times n\) 的字母方阵,内可能蕴含多个 \("yizhong"\) 单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 8 个方向的任一方向, ...

  8. 洛谷P1101单词方阵

    题目描述 给一n×n的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的. 摆放可沿着 8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有 ...

  9. P1101 单词方阵

    题目描述 给一 n \times nn×n 的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88 个方向的任一方向,同一单词摆放 ...

随机推荐

  1. PHP开发者常犯的10个MySQL错误

    原文出处: kaiyuanba   欢迎分享原创到伯乐头条 数据库是WEB大多数应用开发的基础.如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分. PHP看起来很简单,一个初 ...

  2. Xcode学习

    http://www.cnblogs.com/ygm900/p/3488881.html

  3. Git使用简介

    git创建分支并直接切换到分支:git checkout -b name git提交分支到远程服务器: git push origin name/git push origin name:name   ...

  4. Effective C++学习笔记 条款04:确定对象被使用前已先被初始化

    一.为内置类型对象进行手工初始化,因为C++不保证初始化它们. 二.对象初始化数据成员是在进入构造函数用户编写代码前完成,要想对数据成员指定初始化值,那就必须使用初始化列表. class A { pu ...

  5. drop.delete.trauncat的区别

    delete删除数据,保留表结构,可以回滚,如果数据量大,很慢,回滚是因为备份了删除的数据(删除数据时有两个动作,删除和备份) truncate删除所有数据,保留表结构,不可以回滚,一次全部删除所有数 ...

  6. HDU 3746 (KMP求最小循环节) Cyclic Nacklace

    题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...

  7. 8款PHP调试工具

    Web 开发并不是一项轻松的任务,有超级多服务端脚本语言提供给开发者,但是当前 PHP 因为具有额外的一些强大的功能而越来越流行.PHP 是最强大的服务端脚本语言之一,同时也是 web 开发者和设计者 ...

  8. Java Servlet与Applet、CGI、JSP的比较

    Java Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面. Java Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启 ...

  9. 【iOS-Cocos2d游戏开发之四】独自收集Cocos2d提供的字体!共57种(有对照的字体图)

    本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-c ...

  10. HelloX操作系统网络功能简介及使用和开发指南

    HelloX网络功能简介及使用和开发指南 HelloX网络功能简介 作为物联网操作系统,网络功能是必备的核心功能之一.按照规划,HelloX实现了两个不同类型的TCP/IP协议栈,一个面向资源受限的嵌 ...