某次战役中,为便于信息交互,我军侦察部门将此次战役的关键高地坐标设定为(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+")";
}
}