任务概述

给出多条英文单词,找出一个包含所有单词的填字阵。并且对于该方阵有一定特殊要求:

a)      Stage 1

  1. Every phrase in the input file is covered once and only once.
  2. No less than 2 of the phrases must be in these directions:
    1. i.      top-down, bottom-up,  left-right, right-left, and all 4 diagonal directions.
  3. The width and height of the matrix can be different
  4. there doesn’t exist a row or column of letters where none of the letters are covered (不存在一行或一列字母不被任何短语覆盖)。

b)      Stage 2

  1. The matrix must have the same width and height

c)       Stage 3

  1. 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的更多相关文章

  1. python - work4

    # -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: work_20181108.py@ide: PyCharm Communit ...

  2. Node.js:进程、子进程与cluster多核处理模块

    1.process对象 process对象就是处理与进程相关信息的全局对象,不需要require引用,且是EventEmitter的实例. 获取进程信息 process对象提供了很多的API来获取当前 ...

  3. 过年7天乐,学nodejs 也快乐

    自从上次接触nodejs 已经好长时间了,但是年底公司太忙了 ,没时间看, 上次文章在ubuntu上安装nodejs[开启实时web时代] http://www.cnblogs.com/qqlovin ...

  4. 前端页面使用 Json对象与Json字符串之间的互相转换

    前言 在前端页面很多时候都会用到Json这种格式的数据,最近没有前端,后端的我也要什么都要搞,对于Json对象与Json字符串之间的转换终于摸清楚了几种方式,归纳如下! 一:Json对象转换为json ...

  5. FR #3题解

    A. 傻逼题?...前缀和什么的随便搞搞就好了. #include<iostream> #include<cstdio> #include<cstring> #in ...

  6. NOI2014 起床困难综合症

    3668: [Noi2014]起床困难综合症 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 225  Solved: 153[Submit][Stat ...

  7. 【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数 ...

  8. 【博弈论】HDU 5754 Life Winner Bo

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5754 题目大意: 4种棋子,象棋中的 1王,2车,3马,4后,选其一,B和G轮流走,不能往左上走,一 ...

  9. JDBC控制事务

    概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并 ...

随机推荐

  1. git全局配置

    使用git的童鞋都知道,git是非常好的版本管理工具,工具再好要想用的得心应手还是要下凡功夫的,比如可以通过对git的全局配置文件.gitconfig进行适当的配置,可以在日常项目开发中节省很多的时间 ...

  2. inand和emmc区别

    简单来说:inand式sandisk公司做的一款符合emmc标准的一个emmc存储器! ----

  3. Windows 7下配置JDK环境变量,JAVA环境变量配置,Tomcat服务器的使用

    参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1. 常识: 1.1 War包 War包一般是在进行Web开发 ...

  4. 客户视角:Oracle ETL工具ODI

    客户视角:Oracle ETL工具ODI 数据集成已成为企业在追求市场份额中的关键技术组件,与依靠手工编码的方式不同,越来越多的企业选择完整的数据集成解决方案来支持其IT战略,从大数据分析到云平台的集 ...

  5. npm在项目目录安装插件需要使用sudo

    今天使用node的npm安装插件的时候遇到一个问题,那就是在项目目录里面安装插件的时候,必须使用超级用户(sudo)执行才会安装成功,否则会报如下错误: 以安装 gulp-uglify 为例 $ np ...

  6. 1137. Bus Routes(dfs)

    1137 做过一样的 怎么又忘了 再一次搜超时 不用回溯 #include <iostream> #include<cstdio> #include<cstring> ...

  7. Struts2系列——struts2的result

    在action的指定方法执行完毕后总会返回一个字符串,struts2根据返回的字符串去action的配置中的result去找匹配的名字,根据配置执行下一步的操作. 在ActionSupport基类中定 ...

  8. Struts2注解配置之@Namespace(四)

    今天开始学习@Namespace注解. 还是先看一段代码: package com.example.actions; import org.apache.struts2.convention.anno ...

  9. JAVA使用apache http组件发送POST请求

    在上一篇文章中,使用了JDK中原始的HttpURLConnection向指定URL发送POST请求 可以看到编码量有些大,并且使用了输入输出流 传递的参数还是用“name=XXX”这种硬编的字符串进行 ...

  10. bzoj4080

    分组赛时wy大神讲的题,网上都是随机化的题解 我来讲一下正解吧,我们穷举两个点,这两点距离要小于限制 然后我们分别以这两个点为圆心,两点距离为半径画圆 圆圆相交的部分被两点练成线段划分成两部分,不难发 ...