程序练习之地图探测

问题描述
假如有这样一个区域,区域被划分成了一个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();
		}
	}

}

结果
程序练习之地图探测
程序不难,有空把图形界面做出来。