一. 程序设计想法:

于是这次我实在是懵了...真的不会啊...(好在后来得知是个np问题)...

于是听从老师的建议,先从判定算法写起...

于是第一反应这是一个八方搜索啊

我从1~n,1~n表示一个二维字符矩阵,不从0开始的好处是防止溢出。

dfs(int x,int y,int direct,int num,int k)

分别表示此时搜到的坐标为(x,y),方向为direct(若为0则启动1~8循环方向),num为此时序列符合第几个单词(若为-1则启动1~count循环判定符合与否),k表示此时为第num个单词的第k个字母(当k==第num个单词长度时,则搜到完整单词)。

似乎就是一个全排列类似的写法。

需要记录的就是给定的count个单词是否被覆盖且仅被覆盖一次,二维字符矩阵中的每个字符被覆盖了多少次,是否4个顶点都被覆盖,是否有一行或一列没有被覆盖,是否8个方向都满足数量。

似乎简单但写起来却挺费劲。前几天刚写了个数独的解法,用的就是类似的搜索...事实证明可行...

但是

同组小伙伴王文涛提出:我为什么不能暴力一下? 就是对每一个字符进行和给定字符串第一个字符匹配,如果相同则八方暴力搜索。

真暴力!但似乎和搜索的时间复杂度差不多0.0

于是就给他搞了...

我来写生成算法T.T怎么能这样!

还是老办法,分步写...

第一个模块:字符串预处理,把中间空格去掉

 1 int StringPretreatment(int Temp)
 2 {
 3     int Length = strlen(StringInput[Temp]);
 4     for (int i = 0;i < Length;i++)
 5     {
 6         if (StringInput[Temp][i] == ' ')
 7         {
 8             for (int j = i + 1;j < Length;j++)
 9                 StringInput[Temp][j - 1] = StringInput[Temp][j];
10             StringInput[Temp][Length - 1] = EOF;
11             Length--;i--;
12         }
13     }
14     return Length;
15 }

View Code

第二个模块:字符串按长度排序(由于数量不多我就用冒泡了)

 1 void StringSort()
 2 {
 3     int i,j,k;
 4     char StringTemp[25];
 5     for (i = 0;i < StringCount - 1;i++)
 6         for (j = i + 1;j < StringCount;j++)
 7             if (StringLength[i] < StringLength[j])
 8             {
 9                 k = StringLength[i];
10                 StringLength[i] = StringLength[j];
11                 StringLength[j] = k;
12                 strcpy(StringTemp,StringInput[i]);
13                 strcpy(StringInput[i],StringInput[j]);
14                 strcpy(StringInput[j],StringTemp);
15             }
16 }

View Code

我的想法是用2个横&2个竖填充四条边,保证每个单词占据一个顶点,构成一个“卍”(没有中间的十字)

于是代码如下:

 1 void FirstStep()
 2 {
 3     int i,j;
 4     for (i = 0;i < maxN;i++)
 5         for (j = 0;j < maxN;j++) OutputMatrix[i][j] = ' ';
 6     for (i = 0;i < StringLength[0];i++)
 7         OutputMatrix[0][i] = StringInput[0][i];
 8     for (i = 0;i < StringLength[1];i++)
 9         OutputMatrix[maxN - 1][maxN - StringLength[1] + i] = StringInput[1][i];
10     for (i = 0;i < StringLength[2];i++)
11         OutputMatrix[maxN - StringLength[2] + i][0] = StringInput[2][i];
12     for (i = 0;i < StringLength[3];i++)
13         OutputMatrix[i][maxN - 1] = StringInput[3][i];
14 }

View Code

接着继续生成字符矩阵,由于横向正&竖向正已经满足条件,于是我偷懒的不写这两种情况了,剩下的字符串都以剩下6种填充。

我的办法是暴力填充,所选位置为此字符串满足填充条件的第一个位置,因此也就没法保证最小性,但是要是使用dfs枚举所有位置,时间肯定会爆掉。

选取每个字符串走向的办法是对字符串序号取模,对应剩下6种走向。

  1 int StringJudge(int direct,int num,int x,int y)
  2 {
  3     int i,flag = 0,res = 0;
  4     if (direct == 0)
  5     {
  6         if (y >= StringLength[num])
  7         {
  8             for (i = 0;i < StringLength[num];i++)
  9                 if (OutputMatrix[x][y - i] != ' '
 10                 && OutputMatrix[x][y - i] != StringInput[num][i]) flag = 1;
 11             if (flag == 0) res = 1;
 12         }
 13     }
 14     if (direct == 1)
 15     {
 16         if (x >= StringLength[num])
 17         {
 18             for (i = 0;i < StringLength[num];i++)
 19                 if (OutputMatrix[x - i][y] != ' '
 20                 && OutputMatrix[x - i][y] != StringInput[num][i]) flag = 1;
 21             if (flag == 0) res = 1;
 22         }
 23     }
 24     if (direct == 2)
 25     {
 26         if ((StringLength[num] + x) <= maxN && (StringLength[num] + y) <= maxN)
 27         {
 28             for (i = 0;i < StringLength[num];i++)
 29                 if (OutputMatrix[x + i][y + i] != ' '
 30                 && OutputMatrix[x + i][y + i] != StringInput[num][i]) flag = 1;
 31             if (flag == 0) res = 1;
 32         }
 33     }
 34     if (direct == 3)
 35     {
 36         if (x >= StringLength[num] && y >= StringLength[num])
 37         {
 38             for (i = 0;i < StringLength[num];i++)
 39                 if (OutputMatrix[x - i][y - i] != ' '
 40                 && OutputMatrix[x - i][y - i] != StringInput[num][i]) flag = 1;
 41             if (flag == 0) res = 1;
 42         }
 43     }
 44     if (direct == 4)
 45     {
 46         if (y >= StringLength[num] && (x + StringLength[num]) <= maxN)
 47         {
 48             for (i = 0;i < StringLength[num];i++)
 49                 if (OutputMatrix[x + i][y - i] != ' '
 50                 && OutputMatrix[x + i][y - i] != StringInput[num][i]) flag = 1;
 51             if (flag == 0) res = 1;
 52         }
 53     }
 54     if (direct == 5)
 55     {
 56         if (x >= StringLength[num] && (y + StringLength[num]) <= maxN)
 57         {
 58             for (i = 0;i < StringLength[num];i++)
 59                 if (OutputMatrix[x - i][y + i] != ' '
 60                 && OutputMatrix[x - i][y + i] != StringInput[num][i]) flag = 1;
 61             if (flag == 0) res = 1;
 62         }
 63     }
 64     return res;
 65 }
 66 void StringIntoMatrix(int direct,int num,int x,int y)
 67 {
 68     int i;
 69     if (direct == 0)
 70     {
 71         for (i = 0;i < StringLength[num];i++) OutputMatrix[x][y - i] = StringInput[num][i];
 72     }
 73     if (direct == 1)
 74     {
 75         for (i = 0;i < StringLength[num];i++) OutputMatrix[x - i][y] = StringInput[num][i];
 76     }
 77     if (direct == 2)
 78     {
 79         for (i = 0;i < StringLength[num];i++) OutputMatrix[x + i][y + i] = StringInput[num][i];
 80     }
 81     if (direct == 3)
 82     {
 83         for (i = 0;i < StringLength[num];i++) OutputMatrix[x - i][y - i] = StringInput[num][i];
 84     }
 85     if (direct == 4)
 86     {
 87         for (i = 0;i < StringLength[num];i++) OutputMatrix[x + i][y - i] = StringInput[num][i];
 88     }
 89     if (direct == 5)
 90     {
 91         for (i = 0;i < StringLength[num];i++) OutputMatrix[x - i][y + i] = StringInput[num][i];
 92     }
 93 }
 94 void MatrixProduce(int StringNum)
 95 {
 96     int StringDirect = StringNum % 6;
 97     int i,j,flag = 0,suit;
 98     for (i = 0;i < maxN;i++)
 99     {
100         for (j = 0;j < maxN;j++)
101         {
102             if (OutputMatrix[i][j] == ' ' || OutputMatrix[i][j] == StringInput[StringNum][0])
103             {
104                 suit = StringJudge(StringDirect,StringNum,i,j);
105                 if (suit == 1)
106                 {
107                     StringIntoMatrix(StringDirect,StringNum,i,j);
108                     flag = 1;
109                 }
110             }
111             if (flag == 1) break;
112         }
113         if (flag == 1) break;
114     }
115 }

View Code

这样似乎就可以了...当然只要maxN足够大的话,肯定能够把所有字符串放进去,满足全部条件除没有一行一列都是无用字符。

对于那组比较少的数据:

于是空格就是随意填的字符...

需要注意的是,我设定的第一步要求最小的maxN要比最长单词长度大1。

对于那组比较多的数据:

我们能做到20*20的矩阵,这是我们程序能找到的最小解。

最下面两个数字代表总共多少个单词以及成功打印了多少个单词。

二. 时间安排:

预计时间 5h 实际用时 6h
代码规范 0.5h   0.5h
具体设计 0.5h   1h
具体编码 2.5h   3h
代码复审 0.5h   0h
代码测试 0.5h   1h
测试报告 0.5h   0.5h

三. 官方样例测试:(测试程序为王文涛所写)

test1

test2

test3

test4我们试了很多种生成算法(改变不同走向),结果还是通不过检测。

后来............

MUM是无论如何也通不过测试的啊!!!

忽略...

test5

就是这样了...算是较优解吧...

检测代码请见王文涛blogs。

转载于:https://www.cnblogs.com/yimingzou/p/3391451.html

homework-04相关推荐

  1. 04.23 homework

    1.给一个客户同时发送多个附件 import smtplib from email.mime.multipart import MIMEMultipart from email.header impo ...

  2. 【linux】04 ssh

    04 ssh 参考自:Linux基础课. 4.1 ssh 基本用法 远程登录服务器: ssh user@hostname user: 用户名 hostname: IP地址或域名 第一次登录时会提示: ...

  3. web后端--Django学习笔记04

    一:"一对多"模型关系 ​ 在"多"方模型类创建外键类属性,关联"一"方. class School(models.Model): # &q ...

  4. Econometrics Homework (Lab Course: Chapters 2, 3, 4)

    Homework 文章目录 Homework @[toc] Exercise 1 Question: Do.file document and results: 1. Import data : &q ...

  5. docker 配置使用宿主机的GPU(ubuntu16.04+cuda10.0+cudnn7)

    1. 安装 Docker 卸载旧版本 Docker sudo apt-get remove docker docker-engine docker.io containerd runc 安装新版本 s ...

  6. Ubuntu 16.04 安装后修改屏幕分辨率(xrandr: Failed to get size of gamma for output default)

    ubuntu 16.04 安装后分辨率只有一个选项 1024x768,使用 xrandr 命令出现错误: xrandr: Failed to get size of gamma for output ...

  7. Ubuntu 16.04 安装 Docker - Dependency failed for Docker Application Container

    Docker 安装 由于 apt 官方库里的 Docker 版本可能比较旧,所以先卸载可能存在的旧版本: sudo apt-get remove docker docker-engine docker ...

  8. 【Docker】Ubuntu18.04国内源安装Docker-准备工作(一)

    前言: 安装docker由于很多教程都使用国外源和阿里源,安装失败,这里总结一种国内源的安装方法,亲测有效! 过程: 步骤1:在服务器上创建虚拟机 远程连接服务器,win+R--输入mstsc---- ...

  9. 在Ubuntu18.04上安装opencv 3.4.1

    对于安装opencv有的人一次就成功,而有人安装了N多次才成功.我就是那个安装了N多次的人,每次遇到了很多安装错误,只能通过到网上搜教程资料,解决方法:通过一次次的试错,最终完成了安装.再此提醒第一次 ...

  10. Go 中 time.Parse 报错:year/month/day hour/minute/second out of range 时间格式化为什么是 2006-01-02 15:04:05?

    1. 问题现象 在使用 Go 语言的 time.Parse 解析时间时遇到以下错误: func main() {timeParse, err := time.Parse("2006-11-0 ...

最新文章

  1. nginx lua调用redis和mongo
  2. 115开jiang监控
  3. 面试题系列-mysql连环13问
  4. java中邮箱发送_java实现邮箱发送(java mail)
  5. 32位md5解密_GoLang:有趣的密码学之MD5
  6. 乔治亚理工学院计算机专业,乔治亚理工学院
  7. 博文视点程序员读书节,大咖带你共读十日精彩
  8. SylixOS allwinner h6 链接脚本
  9. linux 有dll文件吗,linux上可以运行dll吗
  10. PreparedStatement 大数据查询
  11. 米4android6.0 root,小米4怎么root权限获取?miui6获取root权限方法
  12. 误差条图各部分的代表意思_【小强视界】混凝土搅拌站计量误差原因分析及控制措施...
  13. element+后台管理系统数据导出为excel+进度条导出
  14. December, 14
  15. 透明表——ABAP程序创建透明表
  16. 被设计用于控制计算机英语怎么说,关于计算机专业MVC简介概述的毕业设计论文英文英语外文文献翻译成品资料:模型-视图-控制器(MVC)介绍(中英文双语对照).docx...
  17. Hibernate之两种一对一关系映射方式
  18. figma button_Figma镜子的实时移动ui ux原型
  19. 腾讯T2大牛亲自教你!没有逻辑思维学java很痛苦
  20. Python 代码理解 polygon.py

热门文章

  1. express的cookie解析和签名源码解析
  2. Error Code: 1175. You are using safe update mode and you tried to ......
  3. iptables基础知识.详解
  4. C# 获取几种路径的方式
  5. 基于OHCI的USB主机 —— 前言
  6. 个人开发者做一款Android App需要知道的事情
  7. (踩坑回忆录)Dva踩坑与解决方案
  8. 「译」有限状态机在 CSS 动画中的应用
  9. IOT物联网观察之三大运营商物联网发展进入规模商用阶段
  10. 【踩坑之旅】-webpack (v4.8.1) + vue-cli (v2.5.3)升级准备