work4
任务概述
给出多条英文单词,找出一个包含所有单词的填字阵。并且对于该方阵有一定特殊要求:
a) Stage 1
- Every phrase in the input file is covered once and only once.
- No less than 2 of the phrases must be in these directions:
- i. top-down, bottom-up, left-right, right-left, and all 4 diagonal directions.
- The width and height of the matrix can be different
- there doesn’t exist a row or column of letters where none of the letters are covered (不存在一行或一列字母不被任何短语覆盖)。
b) Stage 2
- The matrix must have the same width and height
c) Stage 3
- The four corners of the output matrix must be occupied by a phrase.
分析过程
在一开始,基于对要求找到最小方阵的误解。我们很容易想到,如果n*n的方阵能放下这些单词,那么(n+1)*(n+1)的方阵则一定能放下。而且严格要求方阵是正方形,所以一开始我想的方案是二分k的大小,然后看k*k的正方形矩阵是否能放入这些单词。
然而,判断过程非常复杂,而且时间复杂度不可估计,所以我放弃了这个想法。
退而求其次,我们可以先找到一个较优解。然后在此基础上做些文章。
我们的想法是,先用一根单词作为轴,然后将其拓展,每个节点上从左上到右下放入一个新单词,形成一个初步的骨架。
然后再对这个骨架进行其它方向的拓展。
为了更加高效的完成这个方案,我决定用一个估价函数来判断这个骨架是否优秀,显而易见骨架的长宽越大骨架就越差,长宽相差的量越大骨架也越差,而骨架放入的单词越多骨架就越好。这个估价函数由金赢同学完成。
在实现的过程中。
实现过程
由c++实现,主程序不断调用搜索引擎,而搜索引擎会随机的进行乱序,使得生成的骨架不一样。
int main()
{
FILE * fout = fopen(output,"w");
int i,j;
char *a;
bool visited[60];
int minx,miny,maxx,maxy,sum,maxsum;
a = (char *)malloc(sizeof(char)*1000000);
for (int times=0;times<1000;times++)
{
deal(a,&minx,&miny,&maxx,&maxy,&sum,visited);
}
for (i=minx;i<=maxx;i++)
{
for (j=miny;j<=maxy;j++)
{
if (a[i*1000+j]!=' ')
{
fprintf(fout,"%c",a[i*1000+j]);
}
else {fprintf(fout,"_");}
}
fprintf(fout,"\n");
}
string sample(""),pattern;
cout<<endl<<sum<<endl;
}
deal函数的参数,分别表示画板,以及画板的的长宽参数,以及单词的使用情况。
Init()为读入和画板初始化的过程。
Set_skeleton()为骨架搜寻过程,寻找在随机化之后,估价最高的骨架。
Plot()将骨架画在画板上,同时对其进行拓展。
void deal(char *oa,int *ominx,int *ominy,int *omaxx,int *omaxy,int *osum,bool *ovisited)
{
init();
set_skeleton();
plot();
int i,j;
int x,y,x0,y0,sqrt,sqrt0;
x=maxx-minx;y=maxy-miny;sqrt=(x-y)*(x-y);
x0=*omaxx-*ominx;y0=*omaxy-*ominy;sqrt0=(x0-y0)*(x0-y0);
if (sum!=n) return;
if (sum-x/5-y/5-sqrt<=*osum-x0/5-y0/5-sqrt0) return;//plot之后的评价方式
for (i=minx;i<=maxx;i++)
{
for (j=miny;j<=maxy;j++)
{
oa[i*1000+j] = a[i][j];
}
}
*ominx=minx;
*ominy=miny;
*omaxx=maxx;
*omaxy=maxy;
*osum =sum;
for (i=0;i<60;i++) {ovisited[i]=visited[i];}
}
小结
由于一开始规划的不好,整个程序构架出现了较大问题,plot函数由于一开始没有将a[][]画板作为全局变量,导致很多plot的内部实现没有使用函数,情况相当臃肿,另外,一开始想法的出错也拖延了很多时间,所以更加认清楚了软件的提前规划过程是相当重要的。
YBAGIGRPCP____________
___SWODNIW____________
__DATROPOD____________
____ELIFPIZSD_________
_____SOIB_____________
__ESRTENREHTE_________
OCITOMEMMHC___________
_____ERAWYPS__________
________WFAEG____P__WS
________IIOVR___O___EM
________DFNNA__T___UBI
________TIRPT_K_C_S_UL
________HMSEUS_RYEA_SI
_________COKETICB_V_BR
__________OD_WONE_NCUD
___________PEPA_R_EAPA
___________RYM_RSMTCLT
__________I_E___P_IHOA
_________F_____NA_QEAB
______________TECRULDA
________________E_E__S
__________________T__C
这是对题目所给条件的输出
|
Personal Software Process Stages |
时间百分比(%) |
实际花费的时间 (分钟) |
原来估计的时间 (分钟) |
|
|
Planning |
计划 |
5 |
||
|
· Estimate |
· 估计这个任务需要多少时间,把工作细化并大致排序 |
5 |
||
|
Development |
开发 |
85 |
||
|
· Analysis |
· 需求分析 (包括学习新技术) |
15 |
||
|
· Design Spec |
· 生成设计文档 |
10 |
||
|
· Design Review |
· 设计复审 (和同事审核设计文档) |
5 |
||
|
· Coding Standard |
· 代码规范 (制定合适的规范) |
10 |
||
|
· Design |
· 具体设计 |
5 |
||
|
· Coding |
· 具体编码 |
20 |
||
|
· Code Review |
· 代码复审 |
5 |
||
|
· Test |
· 测试(自我测试,修改代码,提交修改) |
15 |
||
|
Reporting |
总结报告 |
10 |
||
|
· Test Report |
· 测试报告 |
5 |
||
|
· Size Measurement |
· 计算工作量 |
3 |
||
|
· Postmortem & Improvement Plan |
· 事后总结, 并提出改进 |
2 |
||
|
Total |
总计 |
100% |
总用时 |
总估计的用时 系数为7小时,与计划差不多~ |
work4的更多相关文章
- python - work4
# -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: work_20181108.py@ide: PyCharm Communit ...
- Node.js:进程、子进程与cluster多核处理模块
1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...
- 过年7天乐,学nodejs 也快乐
自从上次接触nodejs 已经好长时间了,但是年底公司太忙了 ,没时间看, 上次文章在ubuntu上安装nodejs[开启实时web时代] http://www.cnblogs.com/qqlovin ...
- 前端页面使用 Json对象与Json字符串之间的互相转换
前言 在前端页面很多时候都会用到Json这种格式的数据,最近没有前端,后端的我也要什么都要搞,对于Json对象与Json字符串之间的转换终于摸清楚了几种方式,归纳如下! 一:Json对象转换为json ...
- FR #3题解
A. 傻逼题?...前缀和什么的随便搞搞就好了. #include<iostream> #include<cstdio> #include<cstring> #in ...
- NOI2014 起床困难综合症
3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 225 Solved: 153[Submit][Stat ...
- 【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数 ...
- 【博弈论】HDU 5754 Life Winner Bo
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 题目大意: 4种棋子,象棋中的 1王,2车,3马,4后,选其一,B和G轮流走,不能往左上走,一 ...
- JDBC控制事务
概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并 ...
随机推荐
- mongodb group分组
先插入测试数据: for(var i=1; i<20; i++){ var num=i%6; db.test.insert({_id:i,name:"user_&quo ...
- MongoDB安装及简单实验
1.Windows下安装MongoDB http://www.mongodb.org/downloads 下载msi,下一步下一步… 安装完毕后,到安装目录的bin目录下执行mongod启动数据库服务 ...
- JVM参数配置
JVM参数配置 设置堆大小 -Xms 初始堆大小 -Xmx 最大堆大小 -Xmn 设置年轻代大小 设置每个线程堆栈大小 -Xss 设置每个线程的堆栈大小 设置年轻代大小 -XX:NewSize= -X ...
- Jquery 弹出新窗体
开始先用css将这个DIV设好位置,并且隐藏 function winshow() { var winNode = $(".win"); winNode.show("sl ...
- bzoj1499: [NOI2005]瑰丽华尔兹
dp. 首先我们可以看到每个时间段只能往一个方向转移最多t步(t为时间段的长度),所以我们可以按时间段dp.因为这个前后值互不影响,也不用占用这一维空间就可以省去. 然后每个时间段内是一列一列(行) ...
- css配合js模拟的select下拉框
css配合js模拟的select下拉框 <!doctype html> <html> <head> <meta charset="utf-8&quo ...
- MasterPage的自身Bug还是?
如果不想每个页面都设置css样式,那就在MasterPage设置即可,但是有个问题就是路径并不能识别正确,所以必须让你的页面和MasterPage的页面在平级的位置. 例如MasterPage.mas ...
- AspNet WebApi OData 学习
OData介绍:是一个查询和更新数据的Web协议.OData应用了web技术如HTTP.Atom发布协议(AtomPub)和JSON等来提供对不同应用程序,服务 和存储的信息访问.除了提供一些基本的操 ...
- 【 D3.js 高级系列 — 8.0 】 标线
有时候,需要在地图上绘制连线,表示"从某处到某处"的意思,这种时候在地图上绘制的连线,称为"标线". 1. 标线是什么 标线,是指地图上需要两个坐标以上才能表示 ...
- Java [leetcode 8] String to Integer (atoi)
问题描述: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input ...