1、输入
因为输出为一个整字符串,字符串包括两行,所以其中会有换行符,又因为windows下和liunx环境下的换行符不太一样,所以最开始需要利用一下的语句分割第一行和第二行。然后第一行和第二行分别处理。
String[] arr = command.split("\r?\n");
2、处理第一行
第一行为 arr[0],同样以“ ”分割 然后初始化迷宫,迷宫大小为输入参数的两倍+1;
int rows = Integer.valueOf(girdString[0]) * 2 + 1;
int columns = Integer.valueOf(girdString[1]) * 2 + 1;
String[][] gird = new String[rows][columns];
gird = initialGird(gird);
/**
* 将迷宫所有格子都初始化为墙
*
* @param gird
* @return
*/
private static String[][] initialGird(String[][] gird) {
for (int i = 0; i < gird.length; i++) {
for (int j = 0; j < gird[0].length; j++) {
gird[i][j] = WAll;
}
}
return gird;
}
3、处理第二行
首先将第二行以 “;” 分割开,然后分别判断每个字符串以空格 " "分割开的个数是否为2个,其次再将已经以空格 “ ”分隔开的字符串用逗号 “,” 分割,最后判断分割后的最小字符串是否为数值型字符串以及是否超出迷宫边界,如果其个数不为2或者最小单位不为数值型或者超出边界都将返回错误提示。
申明一个内部类Cell,其中有两个属性,代表Cell在道路网格中的坐标。
将分割后的最小字符串分别设置为Cell的坐标属性,其中相邻的四个最小字符串为一对Cell,利用isconnected方法判断两个Cell是否相邻。不相邻返回提示。
然后将道路网格中的坐标渲染到迷宫中,重点在于两个Cell中间的那个迷宫格子,中间格子即为两个Cell渲染后的坐标的平均值。
String[] doublePionts = arr[1].split(";");
for (int i = 0; i < doublePionts.length; i++) {
String[] points = doublePionts[i].split(" ");
if (points.length != 2) {
return "Incorrect command format.";
}
for (int j = 0; j < 2; j++) {
String[] point = points[j].split(",");
if (point.length != 2) {
return "Incorrect command format.";
}
if (!isInteger(point[0]) || !isInteger((point[1]))) {
return "Invalid number format.";
}
if (Integer.valueOf(point[0]) > Integer.valueOf(girdString[0]) || Integer.valueOf(point[1]) >
Integer.valueOf(girdString[1])) {
return "Number out of range.";
}
)
Cell c1 = new Cell(Integer.valueOf(points[0].split(",")[0]), Integer.valueOf(points[0].split(",")[1]));
Cell c2 = new Cell(Integer.valueOf(points[1].split(",")[0]), Integer.valueOf(points[1].split(",")[1]));
if (!isconnected(c1, c2)) {
return "Maze format error.";
}
gird[c1.x * 2 + 1][c1.y * 2 + 1] = ROAD;
gird[c2.x * 2 + 1][c2.y * 2 + 1] = ROAD;
gird[(c1.x * 2 + 1 + c2.x * 2 + 1) / 2][(c1.y * 2 + 1 + c2.y * 2 + 1) / 2] = ROAD; //中间值
}
3、输出
因为要输出字符串,所以需要将int[][]转化成String,并且要注意每转换一行需要添加一个换行符。
StringBuilder sb = new StringBuilder();
for (int i = 0; i < gird[0].length; i++) {
for (int j = 0; j < gird.length; j++) {
sb.append(gird[i][j]);
}
sb.append("\n"); //换行符
}
return sb.toString();
4、运行
直接执行main函数即可。如要换输入,将command1字面量换了就行。因为输入的字符串包含换行符,Java控制台不好输入。
5,时间复杂度
初始化迷宫O(n*m) n,m为迷宫大小
判断是否符合格式以及渲染迷宫 O(n) ,n为后面输入的坐标个数。
6、疑惑点
我这个方法不管原来迷宫坐标点值是[W]还是[R],只要是道路网格都会赋值一遍,如果用O(1)时间判断是否为[R],为[R]的不需要再赋值。但是我直接赋值操作时间也是O(1)。
s
网友评论