【现代程序设计】【homework-04】
|
Personal Software Process Stages |
时间百分比(%) |
实际花费的时间 (分钟) |
原来估计的时间 (分钟) |
|
计划 |
0 |
0 |
0 |
|
· 估计这个任务需要多少时间,把工作细化并大致排序 |
0 |
0 |
0 |
|
开发 |
|||
|
· 需求分析 (包括学习新技术) |
0 |
0 |
0 |
|
· 生成设计文档 |
0 |
0 |
0 |
|
· 设计复审 (和同事审核设计文档) |
0 |
0 |
0 |
|
· 代码规范 (制定合适的规范) |
0 |
0 |
0 |
|
· 具体设计 |
5 |
30min |
30min |
|
· 具体编码 |
60 |
3h |
4h |
|
· 代码复审 |
5 |
10min |
0 |
|
· 测试(自我测试,修改代码,提交修改) |
30 |
1h |
1h |
|
总结报告 |
|||
|
|||
|
|||
|
|||
|
总计 |
100% |
总用时 5H |
总估计的用时 6H |
总结:
感觉这次作业在算法方面难度过大,有点难以入手
对于第一个要求:每个单词仅出现一次。这个限制条件过于抽象,无法从这个角度去实现具体编码
我选择的是从【图形必须是正方形】出发
先将n的值设置位Max(WordLength)
然后在这个n*n的矩阵中以某种【特定的顺序】尝试填入所有单词
如果成功,则输出这个矩阵,else n++;
下面解释何为【特定的顺序】
首先从最具体的条件出发,即【每个角都必须有一个单词】
然后从【不能含有空行】这个条件出发,优先把四条边填满
然后将剩余的单词,填入这个矩阵中
具体做法是暴力枚举:即枚举矩阵中的每一个点,如果这个点可以放入某个单词,那么就将这个单词放入
最后将所有的空白,随机填入一个字母
此时检查【单词唯一性】问题,如果不满足,则改变单词的填入顺序
在进行测试
不得不说 这个算法思路实在是非常的烂
虽然能满足所有的限制条件
但是得到的矩阵可能非常大。。。。
因为对于【单词的交错相连】这个点
我暂时没有找到更好的方法去处理这个问题
所以得到的图可能是一个比较松散的图
这是一个测试数据的截图:

下面是用c写的源码:
(将测试数据复制入testdata文本中,将生成同目录下的一个wordoutput文本,用于显示结果)
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#define M 300 #define sinput "testdata.txt"
#define soutput "WordOutPut.txt"
FILE *file,*fileout; int used[M],i,j,k,x,maxl,l,y,n,u,t,an,ini[M],len[M],e,start,charused[M],ismin; char a[M][M],s[M],g[M][M],sum,c[M],dx[]={,,-,,-,,-,},dy[]={,,,-,-,,,-}; int ising(int x,int y)
{
return (x>=&&x<n&&y>=&&y<n);
} f(int dx,int dy,int x,int y,char* s)
{
int i;
for(i=;s[i];i++){
g[x][y]=s[i];
x+=dx;
y+=dy;
}
} int pd(int dx,int dy,int x,int y,char *s)
{
int i;
for(i=;s[i];i++){
if(!(g[x][y]==s[i]||!g[x][y])||!ising(x,y)) return ;
x+=dx;
y+=dy;
}
return ; } main()
{
file=fopen(sinput,"r");
fileout=fopen(soutput,"w"); while(fscanf(file,"%s",s)>){
t=strlen(s);
len[an]=t;
sum+=t; if(maxl<t) maxl=t; ini[s[]]++; strcpy(a[an++],s);
} for(i=;i<an;i++)
for(j=i+;j<an;j++) if(len[i]<len[j]){
strcpy(s,a[i]);
strcpy(a[i],a[j]);
strcpy(a[j],s);
t=len[i];
len[i]=len[j];
len[j]=t;
} x=;
u=; while(){
for(i='a';i<='z';i++) if(ini[i]>=u&&!charused[i]){
c[x++]=i;
charused[i]=;
} if(x<) u--;
else break;
} n=maxl; while(){ for(i=;i<n;i++)
for(j=;j<n;j++) g[i][j]=;
for(i=;i<an;i++) used[i]=; for(i=;i<;i++){
x=y=;
if(i==) y=n-;
else if(i==) x=n-;
else if(i==){
x=n-;
y=n-;
} j=i;
for(k=;k<an;k++) if(!used[k]&&pd(dx[j],dy[j],x,y,a[k])&&a[k][]==c[i]){
used[k]=;
f(dx[j],dy[j],x,y,a[k]);
break;
}
} ///four courner
for(i=;i<;i++){
x=y=;
if(i==) y=n-;
else if(i==) x=n-;
else if(i==){
x=n-;
y=n-;
} for(j=;j<;j++)
for(k=;k<an;k++) if(!used[k]&&pd(dx[j],dy[j],x,y,a[k])&&a[k][]==c[i]){
used[k]=;
f(dx[j],dy[j],x,y,a[k]);
break;
}
} /* //zhongjian x=0;
y=0;
for(i=0;i<n;i++){ x++;
y++; for(j=4;j<6;j++)
for(k=0;k<an;k++) if(!used[k]&&pd(dx[j],dy[j],x,y,a[k])){
used[k]=1;
used[k]=1;
f(dx[j],dy[j],x,y,a[k]);
break;
}
}
*/ //sibian x=y=;
for(i=;i<n;i++){ y++; j=;
for(k=;k<an;k++) if(!used[k]&&pd(dx[j],dy[j],x,y,a[k])){
used[k]=;
used[k]=;
f(dx[j],dy[j],x,y,a[k]);
break;
}
} x=;
y=n-;
for(i=;i<n;i++){ x++; j=;
for(k=;k<an;k++) if(!used[k]&&pd(dx[j],dy[j],x,y,a[k])){
used[k]=;
used[k]=;
f(dx[j],dy[j],x,y,a[k]);
break;
}
} x=n-;
y=n-;
for(i=;i<n;i++){
y--; j=;
for(k=;k<an;k++) if(!used[k]&&pd(dx[j],dy[j],x,y,a[k])){
used[k]=;
used[k]=;
f(dx[j],dy[j],x,y,a[k]);
break;
}
} x=n-;
y=;
for(i=;i<n;i++){ x--; j=;
for(k=;k<an;k++) if(!used[k]&&pd(dx[j],dy[j],x,y,a[k])){
used[k]=;
used[k]=;
f(dx[j],dy[j],x,y,a[k]);
break;
}
} for(i=;i<n;i++)
for(j=;j<n;j++)
for(l=;l>=;l--)
for(k=;k<an;k++) if(!used[k]&&pd(dx[l],dy[l],i,j,a[k])){
used[k]=;
f(dx[l],dy[l],i,j,a[k]);
break;
} ismin=; for(i=;i<an;i++) if(!used[i])
ismin=; if(ismin) n++; else{
srand();
for(i=;i<n;i++){
for(j=;j<n;j++) if(g[i][j]) fprintf(fileout,"%c",g[i][j]); else fprintf(fileout,"%c",rand()%+'a');
fputs("\n",fileout);
}
return ;
} }
}
【现代程序设计】【homework-04】的更多相关文章
- 现代程序设计homework——04
题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ...
- 标准C程序设计七---04
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- 小兔JS教程(四)-- 彻底攻略JS数组
在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...
- nVIDIA SDK White Paper ----Vertex Texture Fetch Water
http://blog.csdn.net/soilwork/article/details/713842 nVIDIA SDK White Paper ----Vertex Texture Fetch ...
- 小兔JS教程(五) 简单易懂的JSON入门
上一节的参考答案: http://xiaotublog.com/demo.html?path=homework/04/index2 本节重点来介绍一下JSON,JSON(JavaScript Obje ...
- 软工+C(9): 助教指南,持续更新...
上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ...
- 20145218 《Java程序设计》第04次实验报告
北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.22 实验名称:Android开发基础 一.实验内容 1.基于Android ...
- [连载]Java程序设计(04)---任务驱动的方法:工资结算系统
任务:或在公司,该公司将其分为三类人员:部门经理.销售员.在发工资的时候,部门经理拿固定月薪8000元.技术人员按每小时100元领取月薪.销售人员依照500元底薪加当月销售额的4%进行提成.设计并实现 ...
- 20172319 2018.04.01-04.11 《Java程序设计》第5周学习总结
20172319 2018.04.01-04.11 <Java程序设计>第5周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错 ...
- 20172319 2018.04.11-16 《Java程序设计教程》 第6周学习总结
20172319 2018.04.11-16 <Java程序设计教程>第6周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题 ...
随机推荐
- 用CImage类来显示PNG、JPG等图片
系统环境:Windows 7软件环境:Visual Studio 2008 SP1本次目的:实现VC单文档.对话框程序显示图片效果 CImage 是VC.NET中定义的一种MFC/ATL共享类,也是A ...
- linux为命令取别名
在linux的命令中,有些命令很长并且经常使用到,我们可以为命令添加一个别名,格式如下: $ alias 别名='命令' 例如: # 列出home文件夹的文件 $ alias lsh='ls -l / ...
- codeforces #310 div1 D
一开始写了个暴力模拟绳子的摆动轨迹 然后在Test 16 T掉了 后来%了一下别人的代码,发现需要对特殊情况进行特殊处理 首先我们考虑绳子的向右摆动,设当前位置为p,绳子当前长度为L 如果其旋转中心位 ...
- UIcollectionView的使用(首页的搭建2)
2.2 直接购买的UIcollectionCell 2.2.1创建CFPromptBuyCell,继承自UICollectionViewCell,定义了标题和图片两个属性 2.2.2 在.m文件中定义 ...
- ArcGIS学习记录—dbf shp shx sbn sbx mdb adf等类型的文件的解释
原文地址: ArcGIS问题:dbf shp shx sbn sbx mdb adf等类型的文件的解释 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.c ...
- Move to Another Changelist
Move to Another Changelist 将选中的文件转移到其他的 Change list 中. Change list 是一个重要的概念,这里需要进行重点说明.很多时候,我们开发一个项目 ...
- PHP 的面向方面编程
面向方面编程(AOP)对于PHP来说是一个新的概念.现在PHP对于 AOP 并没有官方支持,但有很多扩展和库实现了这个特性.本课中,我们将使用 Go! PHP library 来学习 PHP 如何进行 ...
- netty 实现socket服务端编写
import java.net.InetSocketAddress; import io.netty.bootstrap.ServerBootstrap; import io.netty.channe ...
- Redis文档
http://manual.csser.com/redis/connection/auth.html
- 武汉北大青鸟解读2016年10大IT热门岗位
武汉北大青鸟解读2016年10大IT热门岗位 2016年1月5日 13:37 北大青鸟 这是IT从业者的辉煌时代,IT行业的失业率正处在历史的低点,而且有的岗位——例如网络和安全工程师以及软件开发人员 ...