一个机器人可以左转,右转,前移,将这个机器人放置在一个矩形内行走,机器人位置由一个 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个机器人提示)