大概一个月前做了一下Thoughtworks的提前批作业--计算机生成迷宫,但是一直没来得及整理下,今天正好想起来就简要写一写,留作纪念。若有大神的话,希望能帮我看一下,如何做才能提升,或者这个思考的问题还有那些不全面的地方,万分感谢!
题目的话,这里在文章末尾会作说明。
对于这个问题,我选择建了一个maze类,用矩阵元素表示其网格属性,包含成员变量mazetext(最终需要输出渲染字符串),宽和高,成员函数有:构造函数,creat(string &command)函数,setmazetext(int **matrix)函数以及 getmazetext()函数。
其中:
(1)构造函数之前是先将maze初始化为2*2的非连通道路网格,即高宽均为2,渲染字符串赋值"[W] [W] [W] [W] [W]\n[W] [R] [W] [R] [W]\n[W] [W] [W] [W] [W]\n[W] [R] [W] [R] [W]\n[W] [W] [W] [W] [W]\n"; 但现在看来这部分有点占内存,可直接设为空。
(2)create(string &command)通过字符串command进行网格矩阵设置,主要过程:字符串分割获取数据,根据大小初始化道路网格,根据command第二行内容连通各数据网格。对于这些过程处理,第一部分字符串分割获取数据我采用了两个vector进行处理,其实可以直接采用一个函数,在函数中判断是否为数字,是否超出实际范围,这样就可以减少一个vector占用的内存;第二部分与第三部分的操作其实也是可以合并的,都是在处理连通问题,没必要分两次,在这里分析的就只是相邻单元格,那么就是横纵坐标有一个相等一个差二,判断连通,则可行则将其中间元素(如x同y异,则为x,(y1+y2)/2)设为1,而我之前做的判断了四种情况,繁琐不够简洁。
(3)setmazetext(int **matrix)则是根据矩阵元素值对渲染字符串mazetext进行加不同字符串。
(4)getmazetext()返回渲染字符串。
具体程序代码如下(Qt5.6.1 MinGW 32bit,C++),欢迎批评指正~~~
#ifndef MAZE_H
#define MAZE_H
#include<string.h>
#include<vector>
#include<sstream>
#include<cmath>
using namespace std;
#define MAX 100000000
//string split function(seperator " ") to get info enter from keyboard
void SplitString(const string &s,vector<string> &v,const string&c)
{
string::size_type pos1,pos2;
pos2=s.find(c);
pos1=0;
while(string::npos!=pos2)
{
v.push_back(s.substr(pos1,pos2-pos1));
pos1=pos2+c.size();
pos2=s.find(c,pos1);
}
if(pos1!=s.length())
v.push_back(s.substr(pos1));
}
bool isnum(string s)
{
stringstream sin(s);
int t;char p;
if(!(sin>>t)) return false;
if(sin>>p) return false;
else
return true;
}
class maz