天天看點

一篇有意思的筆試題

某次戰役中,為便于資訊互動,我軍偵察部門将此次戰役的關鍵高地坐标設定為(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+")";
    }
}