锦江国际的一道面试题(很简单)
编程技术  /  houtizong 发布于 3年前   67
一个机器人可以左转,右转,前移,将这个机器人放置在一个矩形内行走,机器人位置由一个 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个机器人提示)
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接