`

锦江国际的一道面试题(很简单)

    博客分类:
  • java
 
阅读更多

一个机器人可以左转,右转,前移,将这个机器人放置在一个矩形内行走,机器人位置由一个 x,y 系坐标系和一个朝向确定。地理方向的 N,  S, W,E 分别表示矩形的上下左右。

示例 : 位置坐标 X=0 Y=0 N. 表示机器人在矩形坐标系的左下角 , 面朝上。

为控制机器人的动作,需传送一串简单的字母。传送的字母为: L R M

 L R 分别表示使机器人向左、向右旋转 90 度。但不离开它所在地点; M 表示向前开进一个单位的距离,且保持方向不变 .

  期待输入:

1 )输入初始化矩形的大小为 50 x 50

2)  输入机器人的初始化大小为 X=10,Y=10,N

3)  输入指令 MMLMMR

期待输出:

机器人的坐标及方位

X=8 , Y=12, N

要求

开发语言和工具

JAVA , Junit

 

如果按照题目,实现是很简单的。

 

Dir.java

package interview;

public enum Dir {
	N, S, W, E
}

 

Swerve.java

package interview;

public enum Swerve {
	L, R, M;
}

 

 

Map.java

package interview;
/**
 * 地图类
 * 
 * @author mah
 *
 */
public class Map {
	
	/**
	 * 横轴
	 */
	private int x;
	/**
	 * 纵轴
	 */
	private int y;
	/**
	 * 地图
	 */
	private String[][] myMap;
	
	public Map(int x, int y) {
		this.x = x;
		this.y = y;
		this.myMap = new String[x][y];
	}
	
	/**
	 * 输出地图
	 * @return
	 */
	public String[][] output() {
		for (int i = 0; i < this.x; i++) {
			for (int j = 0; j < this.y; j++) {
				myMap[i][j] = i + "," + j;
			}
		}
		
		//数组上下倒转
		String[][] fanzhuan = new String[x][y];
		for (int i = 0; i < myMap.length; i++) {
			fanzhuan[i] = myMap[myMap.length-1 - i];
		}
		this.myMap = fanzhuan;
		return myMap;
	}
	
	
	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public String[][] getMyMap() {
		return myMap;
	}

	public void setMyMap(String[][] myMap) {
		this.myMap = myMap;
	}

	public static void main(String[] args) {
		int x = 5;
		int y = 10;
		Map m = new Map(x, y);
		String [][] a = m.output();
		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < a[i].length; j++) {
				System.out.print(a[i][j] + " | ");
			}
			System.out.println();
		}
	}

}

 

Robot.java

package interview;

/**
 * 机器人类
 * 
 * @author mah
 */
public class Robot {
	
	/**
	 * 横坐标轴
	 */
	private int x;
	
	/**
	 * 竖坐标轴
	 */
	private int y;
	
	/**
	 * 朝向  N S W E
	 */
	private String dir;
	
	/**
	 * 
	 * @param x x轴
	 * @param y y轴
	 * @param dir 朝向  N S W E
	 */
	public Robot(int x, int y, String dir) {
		this.x = x;
		this.y = y;
		this.dir = dir;
	}
	
	/**
	 * 移动
	 * @param swerve 转向 L,R
	 */
	public void move() {
		this.dir = this.dir.toUpperCase();
		
		if(this.dir.equals(Dir.N.toString())) {
			this.y = this.y + 1;
		} else if(this.dir.equals(Dir.S.toString())) {
			this.y = this.y - 1;
		} else if(this.dir.equals(Dir.W.toString())) {
			this.x = this.x - 1;
		} else if(this.dir.equals(Dir.E.toString())) {
			this.x = this.x + 1;
		}
	}
	
	/**
	 * 转向
	 * @param swerve L,R
	 */
	public void swerve(String swerve) {
		this.dir = this.dir.toUpperCase();
		swerve = swerve.toUpperCase();
		
		if(this.dir.equals(Dir.N.toString())) {
			if(swerve.equals(Swerve.L.toString())) {
				this.dir = Dir.W.toString();
			} else if(swerve.equals(Swerve.R.toString())) {
				this.dir = Dir.E.toString();
			}
		} else if(this.dir.equals(Dir.S.toString())) {
			if(swerve.equals(Swerve.L.toString())) {
				this.dir = Dir.E.toString();
			} else if(swerve.equals(Swerve.R.toString())) {
				this.dir = Dir.W.toString();
			}
		} else if(this.dir.equals(Dir.W.toString())) {
			if(swerve.equals(Swerve.L.toString())) {
				this.dir = Dir.S.toString();
			} else if(swerve.equals(Swerve.R.toString())) {
				this.dir = Dir.N.toString();
			}
		} else if(this.dir.equals(Dir.E.toString())) {
			if(swerve.equals(Swerve.L.toString())) {
				this.dir = Dir.N.toString();
			} else if(swerve.equals(Swerve.R.toString())) {
				this.dir = Dir.S.toString();
			}
		}
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public String getDir() {
		return dir;
	}

	public void setDir(String dir) {
		this.dir = dir;
	}


	public String toString() {
		return "位于" + this.x + "," + this.y + ", " + "面朝 " + this.dir;
	}
	
	
}

 

Test.java(这里没用JUnit)

package interview;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
	
	public static void main(String[] args) {
		Map map = new Map(51,51);
		Robot robot = new Robot(10, 10, "N");
		Operator op = new Operator(map, robot);
		while (true) {
			Scanner input = null;
			input = new Scanner(System.in);
			String dictate = null;
			if(input != null) {
				dictate = input.nextLine().toLowerCase();
			}
			if(dictate.equals("exit")) {
				break;
			} else {
				Pattern p = Pattern.compile("[lrm]*", Pattern.CASE_INSENSITIVE);
				Matcher m = p.matcher(dictate);
				boolean flag = m.matches();
				if(flag) {
					String errStr = op.isOut(robot, dictate);
					if(errStr != null) {
						System.out.println(errStr);
					} else {
						System.out.println("目前:" + robot.toString());
					}
				} else {
					System.out.println("指令错误,请重新输入(L,R,M)");
				}
			}
		}
	}
}

 

package interview;

public class Operator {
	/**
	 * 地图类
	 */
	private Map map;
	/**
	 * 机器人类
	 */
	private Robot robot;
	
	public Operator(Map map, Robot robot) {
		this.map = map;
		this.robot = robot;
	}
	
	public void toSwerve(String swerve) {
		this.robot.swerve(swerve);
		//System.out.println("当前方向为" + robot.getDir());
	}
	
	
	/**
	 * 移动 
	 * @param dictate 指令
	 */
	public void tomove(String dictate) {
		String errStr = isOut(this.robot, dictate);
		if(errStr != null) {
			System.out.println(errStr);
		} else {
			System.out.println(robot.toString());
		}
	}
	
	
	
	/**
	 * 判断是否超出地图边界 
	 * 地图边界:上边界为y,下边界为0,左边界为0,右边界为x
	 * @param x
	 * @param y
	 * @param dictate 指定
	 * @return 如果为null,则没超出边界,如果不为null,则抛出信息
	 */
	public String isOut(Robot robot, String dictate){
		int ori_x = robot.getX();
		int ori_y = robot.getY();
		String ori_dir = robot.getDir();
		
		char[] dics = dictate.toCharArray();
		for (int i = 0; i < dics.length; i++) {
			String newdics = String.valueOf(dics[i]).toUpperCase();
			if(newdics.equals(Swerve.M.toString())) {
				robot.move();
			} else {
				robot.swerve(newdics);
			}
		}
		if(robot.getX() < 0 || robot.getX() > map.getX()) {
			this.robot.setX(ori_x);
			this.robot.setY(ori_y);
			this.robot.setDir(ori_dir);
			return "x轴超出边界,返回原点。";
		}
		if(robot.getY() < 0 || robot.getY() > map.getY()) {
			this.robot.setX(ori_x);
			this.robot.setY(ori_y);
			this.robot.setDir(ori_dir);
			return "y轴超出边界,返回原点。";
		}
		return null;
	}
	
	
	public String printInfo() {
		return this.robot.toString();
	}

	public Map getMap() {
		return map;
	}

	public void setMap(Map map) {
		this.map = map;
	}

	public Robot getRobot() {
		return robot;
	}

	public void setRobot(Robot robot) {
		this.robot = robot;
	}
	
	
}
 

 

到这里就实现了这个面试题

但在面试时,面试官又问:如果有2个机器人,或者N多个机器人,如何让多个机器人不会撞到一起(或者撞到一起后,给2个机器人提示)

分享到:
评论
3 楼 国产希特勒 2012-07-09  
真强,居然有人把公司的面试题挂到javaeye上了
2 楼 hongmin118 2012-03-07  
caofaping 写道
Operator  这个类呢?大哥。。

Operator类已补
1 楼 caofaping 2012-02-23  
Operator  这个类呢?大哥。。

相关推荐

Global site tag (gtag.js) - Google Analytics