首页 > 试题广场 >

坐标移动

[编程题]坐标移动
  • 热度指数:614590 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}我们定义一个无限大的二维网格上有一个小人,小人初始位置为 (0,0) 点,小人可以读取指令上下左右移动。一个合法的指令由三至四个符号组成:
\hspace{23pt}\bullet\,第一个符号为 \texttt{ 中的一个,代表小人移动的方向;分别代表向左、向右、向上、向下移动;记某个时刻小人的坐标为 (x,y),向左移动一格即抵达 (x-1,y)、向右移动一格即抵达 (x+1,y)、向上移动一格即抵达 (x,y+1)、向下移动一格即抵达 (x,y-1)
\hspace{23pt}\bullet\,最后一个符号为 \texttt{`;'},代表指令的结束,该符号固定存在;
\hspace{23pt}\bullet\,中间为一个大于 0 且小于 100 的数字,代表小人移动的距离。特别地,如果这个数字小于 10,那么它可能包含一个前导零,此时也视为合法。

\hspace{15pt}如果你遇到了一个不合法的指令,则直接忽略;例如,指令 \texttt{ 是不合法的,因为 100 超出了规定的数字范围;\texttt{ 也是不合法的,因为 \texttt{Y} 不是 \texttt{ 中的一个。
\hspace{15pt}输出小人最终的坐标。

输入描述:
\hspace{15pt}在一行上输入一个长度 1 \leqq {\rm length}(s) \leqq 10^4,由大写字母、数字和分号(\texttt{`;'})构成的字符串 s,代表输入的指令序列。保证字符串中至少存在一个 \texttt{`;'},且末尾一定为 \texttt{`;'}


输出描述:
\hspace{15pt}在一行上输出一个两个整数,代表小人最终位置的横纵坐标,使用逗号间隔。
示例1

输入

A10;S20;W10;D30;X;A1A;B10A11;;A10;

输出

10,-10

说明

\hspace{15pt}对于这个样例,我们模拟小人的移动过程:
\hspace{23pt}\bullet\,第一个指令 \texttt{ 是合法的,向左移动 10 个单位,到达 (-10,0) 点;
\hspace{23pt}\bullet\,第二个指令 \texttt{ 是合法的,向下移动 20 个单位,到达 (-10,-20) 点;
\hspace{23pt}\bullet\,第三个指令 \texttt{ 是合法的,向上移动 10 个单位,到达 (-10,-10) 点;
\hspace{23pt}\bullet\,第四个指令 \texttt{ 是合法的,向右移动 30 个单位,到达 (20,-10) 点;
\hspace{23pt}\bullet\,第五个指令 \texttt{ 不合法,跳过;
\hspace{23pt}\bullet\,第六个指令 \texttt{ 不合法,跳过;
\hspace{23pt}\bullet\,第七个指令 \texttt{ 不合法,跳过;
\hspace{23pt}\bullet\,第八个指令 \texttt{ 不合法,跳过;
\hspace{23pt}\bullet\,第九个指令 \texttt{ 是合法的,向左移动 10 个单位,到达 (10,-10) 点。
示例2

输入

ABC;AKL;DA1;D001;W023;A100;S00;

输出

0,0

说明

\hspace{15pt}在这个样例中,全部指令均不合法,因此小人不移动。
示例3

输入

A00;S01;W2;

输出

0,1

备注:
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-05-15 更新题面,新增几组hack数据(暂未进行重测)。
2. 2024-12-16 更新题面。
let str = readline().split(";");
let lastdata = [0, 0];
for (let j = 0; j < str.length; j++) {
  // 空字符串剔除
  if (str[j]) {
    let [one, two] = [(str[j].slice(0, 1)).toUpperCase(), str[j].slice(1)];
    // 第一个字符必须是A/S/W/D,第二个字符必须是纯数字,不能使用parseInt
    // parseInt('12e')会输出12,Number('12e')会输出NaN
    if (['A', 'S', 'W', 'D'].includes(one) && Number(two)) {
      if (one === "A") {
        lastdata[0] = lastdata[0] - Number(two);
      }
      if (one === "S") {
        lastdata[1] = lastdata[1] - Number(two);
      }
      if (one === "W") {
        lastdata[1] = lastdata[1] + Number(two);
      }
      if (one === "D") {
        lastdata[0] = lastdata[0] + Number(two);
      }
    }
  }
}
console.log(lastdata);

发表于 2022-08-31 11:24:10 回复(0)
function zuobiao(str){
    let arr=str.split(";")
    let x=0,y=0
    for(let i=0;i<arr.length;i++){
        let fx=arr[i].slice(0,1)
        let sz=arr[i].slice(1)
        if(!sz.match(/[^0-9]/g)){
            sz=parseInt(sz)
            if(fx==='A'){
                x=x-sz
            }else if(fx==='S'){
                y=y-sz
            }else if(fx==='D'){
                x=x+sz
            }else if(fx==='W'){
                y=y+sz
            }else{
                
            }
        } 
    }
    console.log([x,y].join(",")) 
}
let str=readline()
zuobiao(str)
发表于 2022-08-25 19:14:21 回复(0)

好奇怪。。为啥我自己的IDE运算的结果就是对的,在这个上面就不对。但是只要在中间添加一行console.log(temp1,temp2,reg.test(item))就又能神奇的显示正确答案了。。求解

let reg=/^(A|S|W|D)[0-9][0-9]/g
let str=readline().split(';')
let loc=new Array(2).fill(0)
str.forEach((item)=>{
    if(reg.test(item)){
        let temp1=item.substring(0,1)
        let temp2=parseInt(item.substring(1,3))
        if(temp1==='A'){
            loc[0]-=temp2
        }else if(temp1==='S'){
            loc[1]-=temp2
        }else if(temp1==='W'){
            loc[0]+=temp2
        }else{
            loc[1]+=temp2
        }
    }
})
console.log(loc)
发表于 2022-08-18 00:06:12 回复(0)
let coord = [0, 0];
let code = ["A", "W", "S", "D"];
let arr = readline().split(";");
let nArr = [];
let regNum = /^\d+$/;
for (let i = 0; i < arr.length; i++) {
  //删除不合规的移动
  if (code.indexOf(arr[i][0]) !== -1) {
    //如果第一个字母是方向键
    let box = arr[i].split("");
    let first = box.shift();
    if (regNum.test(Number(box.join("")))) {
      //如果剩下的是数字
      let lastNum = Number(box.join(""));
      if (first === "A") {
        coord[0] -= lastNum;
      }
      if (first === "D") {
        coord[0] += lastNum;
      }
      if (first === "W") {
        coord[1] += lastNum;
      }
      if (first === "S") {
        coord[1] -= lastNum;
      }
    }
  }
}
console.log(coord)
发表于 2022-07-22 15:01:18 回复(0)
let input = readline();
let arr = input.split(";");
let result = arr.reduce((pre,cur,index,arr)=>{
    let firstWord = cur.slice(0,1);
    let num = +cur.slice(1,3);
    if (isVaild(cur)) {
        firstWord === 'A' && (pre[0] -= num);
        firstWord === 'D' && (pre[0] += num);
        firstWord === 'W' && (pre[1] += num);
        firstWord === 'S' && (pre[1] -= num);
    }
    return pre;
}, [0,0]);

function isVaild(str) {
    return /^(A|W|S|D)+\d{1,2}$/.test(str);
}

print(result.join(','));

发表于 2022-07-14 08:06:01 回复(0)
被 `switch case` 坑苦了,match 出来的和列举的 case 不能 ===
function solution(str) {
  let arr1 = str.split(";");
  let reg1 = /^[W|A|S|D]\d+$/;
  let resultArr = [];
  arr1.forEach((item) => {
    if (item.match(reg1)) resultArr.push(item);
  });
  let reg2 = /[W|A|S|D]/;
  let reg3 = /\d+/;
  let x = 0;
  let y = 0;
  resultArr.forEach((item) => {
    let dir = item.match(reg2).toString();
    let step = Number(item.match(reg3));
    switch (dir) {
      case "W":
        y += step;
        break;
      case "A":
        x -= step;
        break;
      case "S":
        y -= step;
        break;
      case "D":
        x += step;
        break;
      default:
        break;
    }
  });
  console.log(`${x},${y}`);
}
solution(readline());


发表于 2022-07-11 22:54:19 回复(0)
var line = readline()
var steps = line.split(';')
var reg = /^([ADWS]{1})(\d{1,2})$/
var res = steps.reduce((res, step) => {
    if (reg.test(step)) {
        var d = RegExp.$1
        var n = +RegExp.$2
        if (d === 'A') {
            res[0] -= n
        } else if (d === 'D') {
            res[0] += n
        } else if (d === 'W') {
            res[1] += n
        } else if (d === 'S') {
            res[1] -= n
        }
    }
    return res
}, [0, 0])
print(res.join(','))

发表于 2022-07-08 21:16:42 回复(0)
const arr = readline().split(";")
let reg = /^[ASWD]\d{1,2}$/
let newArr = arr.filter(item=> reg.test(item))
let res = [0,0]
newArr.forEach(item=>{
    let moveP = item.slice(0,1)
    switch(moveP){
        case 'A':
            res[0] = res[0]-item.slice(1)*1
            break;
        case 'D':
            res[0] = res[0]+item.slice(1)*1
             break;
        case 'W':
            res[1] = res[1]+item.slice(1)*1
             break;
        case 'S':
            res[1] = res[1]-item.slice(1)*1
             break;
    }
})
console.log(res.join(','))

发表于 2022-07-04 10:40:33 回复(0)
var arr = readline().split(';');
var x = 0;
var y = 0;

arr.map((item,index) => {
    if(item){
        let pos = item.substring(0,1);
        let num = Number(item.substring(1));
        if (num > 0) {
            switch(pos){
                case 'A':
                    x = x - num;
                    break;
                case 'D':
                    x = x + num;
                    break;
                case 'W':
                    y = y + num;
                    break;
                case 'S':
                    y = y - num;
                    break;
                default:
                    break;
            }
        } 
        
    }
    if (index == (arr.length - 1)){
        console.log(x+','+y)
    }
     
})
PS:转化数组,map循环,空值直接跳过,Number可以判断是否是纯数字还可以使数据类型变成init型,不大于0的也直接跳过,个人观点,不是最优,但逻辑最直白简单
发表于 2022-06-29 15:53:51 回复(0)
let inputStr = readline().toUpperCase();
let arr = inputStr.split(";");
let res = arr.reduce(
  (acc, next) => {
    let direction = next[0];
    let str = next.slice(1);
    let num = parseInt(str);
    if (str != num) {
      return acc;
    }
    switch (direction) {
      case "A":
        acc.x -= num;
        break;
      case "D":
        acc.x += num;
        break;
      case "W":
        acc.y += num;
        break;
      case "S":
        acc.y -= num;
        break;
    }
    return acc;
  },
  { x: 0, y: 0 }
);
console.log(res.x + "," + res.y);

发表于 2022-06-28 19:20:44 回复(0)
let inputStr = readline();
let calcPoint = function (str) {
  let strArr = str.split(";"),
    x = 0,
    y = 0;
  for (let i = 0; i < strArr.length; i++) {
    let num = Number(strArr[i].slice(1, 3));
    if (!!num) {
      if (strArr[i][0] == "A") {
        x -= num;
      } else if (strArr[i][0] == "S") {
        y -= num;
      } else if (strArr[i][0] == "W") {
        y += num;
      } else if (strArr[i][0] == "D") {
        x += num;
      }
    }
  }
  return x + "," + y;
};

console.log(calcPoint(inputStr));
//先判断是不是数字,另一种思想,哈哈
发表于 2022-06-21 16:20:46 回复(0)
let s = readline();
s = s.split(";");
let reg = /^[ASDW][0-9]{1,2}$/;
let res = [0, 0];
for (i of s) {
  if (reg.test(i)) {
    let num = Number(i.substring(1));
    switch (i[0]) {
      case "A":
        res[0] = res[0] - num;
        break;
      case "D":
        res[0] = res[0] + num;
        break;
      case "W":
        res[1] = res[1] + num;
        break;
      case "S":
        res[1] = res[1] - num;
        break;
      default:
        res[0] = res[0] + 0;
        break;
    }
  }
}
console.log(res)

发表于 2022-06-08 16:46:40 回复(0)
优雅~
合理使用三元表达式能够让代码看起来简洁
let strArr = readline().split(';')
let reg = /^(A|W|S|D){1}[0-9]{1,2}$/
let arr = []

strArr.forEach(item => reg.test(item) ? arr.push(item) : '')

let x = 0, y = 0
arr.forEach(item => {
    let key = item[0]
    let value = parseInt(item.slice(1))
    x = key == 'A' ? x - value : x
    x = key == 'D' ? x + value : x
    y = key == 'W' ? y + value : y
    y = key == 'S' ? y - value : y
})

console.log(x + ',' + y)


发表于 2022-06-02 15:37:07 回复(0)
let input = readline();
let op_type = ['A','D','W','S']
let t_ops = input.split(';')
let ops = t_ops.filter(r => {
    return /^[A,D,S,W][1-9][0-9]*$/.test(r);
}) 
let xy = {
    'x': 0,
    'y': 0
}
for(r of ops) {
    let prefix = r.substring(0,1);
    let val = new Number(r.substring(1, r.length));
    if(prefix == 'A' || prefix == 'D') {
        xy.x = xy.x + (prefix == 'D' ? val : val * -1)
    }
    if(prefix == 'W' || prefix == 'S') {
        xy.y = xy.y + ( prefix == 'W' ? val : val * -1) 
    }
}
console.log(xy.x + ',' + xy.y)
/**
ops.forEach(r => {
    let prefix = r.subStr(0,1);
    let val = r.substr(1, r.length -1)
    console.log(prefix, val)
})
**/
发表于 2022-05-25 15:31:42 回复(0)
let a = readline().split(';');

let x = 0; let y = 0;
a.forEach(e => {
    if (!e) return;
    let fx = e.slice(0, 1);
    let nu = Number(e.slice(1));
    if (!['A', 'S', 'W', 'D'].includes(fx)) return;
    if (!nu) return;
    
    switch(fx) {
        case 'A':
            x -= nu;
            break;
        case 'D':
            x += nu;
            break;
        case 'S':
            y -= nu;
            break;
        case 'W':
            y += nu;
            break;
    }
})

console.log(`${x},${y}`)

发表于 2022-05-22 16:18:26 回复(0)