程序练习之地图探测
问题描述
假如有这样一个区域,区域被划分成了一个4 x 6的探测网格,区域的长和宽都不能超过100。
在探测这个区域时,将会沿着蛇形路线遍历探测网格上的每一个格子:从左上角开始,向右飞行到尽头;再转向下一行,从右向左飞到尽头;再转头在下一行,从左向右飞行;不停循环直到探测完整个区域。比如这个例子中,飞行探测路线将是这样的:
先沿着既定的路线进行探测,最后把探测到的地形保存在一个字符串中带回来。字符串中字符按照探测每个格子的顺序排序,而每种字符表示一种不同的地形:
● R:河流;
● G:草原;
● F:森林;
比如在这个例子中,带回来的地形字符串“GRRGGGGGGRFFFFRGGFFGRRFF”,那我们就可以根据上面的线图和对应的地形字符,在地图上标记出探测区域的地形:
根据以上的描述,得到程序的要求:
在程序中接收两行输入:
● 第一行是两个数字,用空格分隔,表示探测网格的大小。例如:4 6 表示探测区域是一个大小4 x 6的区域。
● 第二行是一个字符串,表示探测到的对应地形。
需要输出一个和探测网格同大小的矩阵,并且保证矩阵中的字符对应探测到的相应位置的地形。
例如,如果给定输入:
4 6
GRRGGGGGGRFFFFRGGFFGRRFF
则输出的字符串为:
GRRGGG
FFRGGG
FFRGGF
FFRRGF
在处理输入的时候需要检查输入的有效性。需要检查的有效性包括几个方面:
● 无效的探测网格:第一行输入如果不能正确转换成合适的探测网格大小,此时程序输出错误信息”Incorrect mesh size.”
● 无效的地形字符:输入的探测的字符出现了不合法字符,此时程序输出错误信息“Invalid cell type”
● 数据不匹配:输入的探测的字符串长度和探测网格大小不一致,此时程序输出错误信息“Data mismatch”
Java实现:
import java.util.Scanner;
public class MapClass {
public static void main(String[] args) {
// 输入区域长和宽
Scanner sc = new Scanner(System.in);
int a,b;
a = sc.nextInt();
b = sc.nextInt();
//判断长宽是否符合要求
if(a>100||b>100||a<1||b<1){
System.out.println("Incorrect mesh size");
return;
}
//输入字符串
String inmap = new String();
inmap = sc.next();
//判断字符串长度是否符合要求
if(inmap.length()!=a*b){
System.out.println("Data mismatch");
return;
}
//判断输入的字符是否符合要求
char[] ch = inmap.toCharArray();
for(int i=0;i<inmap.length();i++){
if(ch[i]=='G'||ch[i]=='R'||ch[i]=='F');
else{
System.out.println("Invalid cell type");
return;
}
}
char [][] outmap = new char[a][b];
int f=0;//标识,0表示从前往后,1表示从后往前
//将字符串整理进二维字符数组
for(int i=0;i<ch.length;){
if(f%2==0){
for(int j=0;j<b&&i<ch.length;j++){
outmap[f][j]=ch[i++];
}
f++;
}else if(f%2==1){
for(int j=b-1;j>=0&&i<ch.length;j--){
outmap[f][j]=ch[i++];
}
f++;
}
}
//输出
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
System.out.print(outmap[i][j]);
}
System.out.println();
}
}
}
结果
程序不难,有空把图形界面做出来。