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