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