天天看点

一篇有意思的笔试题

某次战役中,为便于信息交互,我军侦察部门将此次战役的关键高地坐标设定为(x=0,y=0)并规定,每向东增加100米,x加1,每向北增加100米,y加1。

同时,我军情报部门也破译了敌军向坦克发送的指挥信号,其中有三种信号(L,R,M)用于控制坦克的运动,L 和 R 分别表示使令坦克向左、向右转向,M 表示令坦克直线开进100米,其它信号如T用于时间同步,P用于反转信号,既出现p,后面的信号向左变为向右,向右变为向左,向前变为向后,反之亦然。

一日,我军侦察兵发现了敌军的一辆坦克,侦察兵立即将坦克所在坐标(P, Q)及坦克前进方向(W:西,E:东,N:北,S:南)发送给指挥部,同时启动信号接收器,将坦克接收到的信号实时同步发往指挥部,指挥部根据这些信息得以实时掌控了该坦克的位置,并使用榴弹炮精准地击毁了该坦克。

假设,侦察兵发送给指挥部的信息如下:坦克坐标:(11,39)坦克运行方向:W,坦克接收到的信号为:MTMPRPMTMLMRPRMTPLMMTLMRRMP,请通过编程计算出坦克所在的位置(编程语言不限)。@Smile 万能的飘总 试试这个

python 实现:

class Tanke:
    # 先确定方向的指针
    pointer = 'NESW'  # 方向指针
    shift = {'N': 'y+1', 'S': 'y-1', 'W': 'x-1', 'E': 'x+1'}  # 定义位移偏量
	# 初始化操作
    def __init__(self, position, direction):
        self.x, self.y = position
        self.direction = direction
        self.position = (self.x, self.y)
	# 确定移动接收的信号命令
    def sin(self, orders):
        for i in orders:
            if i in 'LR':
                self.turn(i)
            elif i == 'M':
                self.move()
            elif i == 'P':
                self.pd()
	# 判断移动的方向
    def turn(self, orders):
        i = self.pointer.find(self.direction)
        if orders == 'L':
            i -= 1
        elif orders == 'R':
            i += 1
        self.direction = self.pointer[i % 4]
	# 确定移动路径
    def move(self):
        orders = self.shift[self.direction]
        if orders[0] == 'x':
            x = self.x
            self.x = eval(orders)
        else:
            y = self.y
            self.y = eval(orders)
        self.position = (self.x, self.y)
	# 实例化坐标轴的位置
    def pd(self):
        print(self.position, self.direction)


tanke = Tanke((11, 39), 'W')
tanke.sin('MTMPRPMTMLMRPRMTPLMMTLMRRMP')
           

Java 实现:

package bst;

public class Bst {
    //坦克初始坐标
    ZB zb = new ZB(11,39);
    //坦克初始运行方向
    String direction = "W";
    
    //根据接收到的信号编程计算出坦克最终的坐标
    public ZB getZB(String news){
        
        String[] str = news.split("");
        
        for(int i = 0;i<str.length;i++){
            if("L".equals(str[i])){
                switch (direction) {
                case "W":direction="S";break;
                case "E":direction="N";break;
                case "N":direction="W";break;
                case "S":direction="E";break;
                default:break;
                }
            }else if("R".equals(str[i])){
                switch (direction) {
                case "W":direction="N";break;
                case "E":direction="S";break;
                case "N":direction="E";break;
                case "S":direction="W";break;
                default:break;
                }
            }else if("M".equals(str[i])){
                switch (direction) {
                case "W":zb.setX(zb.getX()-1);break;
                case "E":zb.setX(zb.getX()+1);break;
                case "N":zb.setY(zb.getY()+1);break;
                case "S":zb.setY(zb.getY()-1);break;
                default:break;
                }
            }
        }
        
        return zb;
        
    }
    
    //打印出坦克的最终坐标
    public static void main(String[] args) {
        Bst bst = new Bst();
        ZB zb = bst.getZB("MTMPRPMTMLMRPRMTPLMMTLMRRMP");
        System.out.println("坦克所在的位置为:"+zb.toString());
    }

}

//坦克坐标类
class ZB{
    int x;
    int y;
    
    public ZB(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }

    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;
    }
    
    //重写toString方法
    public String toString(){
        return "("+x+","+y+")";
    }
}