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

来源:互联网 发布:淘宝的收货地址怎么删 编辑:程序博客网 时间:2024/06/11 20:12

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

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

为控制机器人的动作,需传送一串简单的字母。传送的字母为:LR 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个机器人提示)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 重生之谋离 在全球游戏里当房东的日子 我把师门送上天 玄门小奶包是冥界最强打工人 珠柔 我靠完成小团子心愿续命 举一反三式爱你 战神她在娱乐圈杀疯了 当家嫡女:背靠系统富甲天下 停!反派总裁不准亲亲抱抱系统 逃荒:嫁给黏唧唧人鱼后吃不消了 荒野直播:影帝的小娇娇藏不住了 限时暗恋 被迫给反派续命后在娱乐圈爆火了 将军夫人你莫走 在源能世界中觉醒全知之眼 我去华娱探探路 带娃虐渣,女将军穿年代后杀疯了 带着妈妈活到末世结束 十八线女配穿进后宫演顶流 斗罗:重生胡列娜在武魂殿当团宠 大景女星官 报!娘娘在种田路上福星高照 靠美食成为星际首富 夫人她每天都想摸鱼摆烂 寒门重生女 穿书:侧妃她要改剧本 作妖小青梅总想遇见我 重生成团宠文炮灰 全师门就我一个人是废柴 反派家的团宠崽崽是神兽 越界臣服 重生之鱼刺救我狗命 修仙:哈哈哈鸡汤来咯 萌宝来袭:带着空间穿九零 快跑,宿主她不对劲 小哭包她软软糯糯 超甜!重生后左相被我撩到腿软 超真实探案推理游戏 惊!霍总怀里的小娇妻失忆后想逃婚 我和暴君有个崽