首页 > 试题广场 >

坐标移动

[编程题]坐标移动
  • 热度指数:591865 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

输入:

合法坐标为A(或者D或者W或者S) + 数字(两位以内)

坐标之间以;分隔。

非法坐标点需要进行丢弃。如AA10;  A1A;  $%$;  YAD; 等。

下面是一个简单的例子 如:

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

处理过程:

起点(0,0)

+   A10   =  (-10,0)

+   S20   =  (-10,-20)

+   W10  =  (-10,-10)

+   D30  =  (20,-10)

+   x    =  无效

+   A1A   =  无效

+   B10A11   =  无效

+  一个空 不影响

+   A10  =  (10,-10)

结果 (10, -10)

数据范围:每组输入的字符串长度满足 ,坐标保证满足 ,且数字部分仅含正数

输入描述:

一行字符串



输出描述:

最终坐标,以逗号分隔

示例1

输入

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

输出

10,-10
示例2

输入

ABC;AKL;DA1;

输出

0,0
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();

        // 分割字符串得到命令数组
        String[] commands = str.split(";");
        int x = 0, y = 0;

        for(int i = 0; i < commands.length; i++) {
            if(isValid(commands[i])) {
                char dir = commands[i].charAt(0);
                int len = Integer.parseInt(commands[i].substring(1));
                if(dir == 'A') {
                    x -= len;
                }
                else if(dir == 'D') {
                    x += len;
                }
                else if(dir == 'W') {
                    y += len;
                }
                else if(dir == 'S') {
                    y -= len;
                }
            }
        }
        System.out.print(x + "," + y);
    }
    // 检查命令是否有效
    public static boolean isValid(String str) {
        if(str.equals(" ") || str.length() > 3 || str.length() < 2) {
            return false;
        }
        // 如果命令长度是3,检查要第三个字符  
        if(str.length() == 3 && !isDigit(str.charAt(2))) {
            return false;
        }
        if(isLetter(str.charAt(0)) && isDigit(str.charAt(1))) {
            return true;
        }
        return false;
    }
    // 检查命令的方向操作符是否有效
    public static boolean isLetter(char c) {
        if(c == 'A' || c == 'D' || c == 'W' || c == 'S') {
            return true;
        }
        return false;
    }
    // 检查字符是否是数字
    public static boolean isDigit(char c) {
        if(c >= '0' && c <= '9') {
            return true;
        }
        return false;
    }
}

发表于 2024-09-07 11:06:15 回复(0)
import java.util.*;
import java.util.regex.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 caset();
String s = in.nextLine();
if (s == null || s.isEmpty()) {
System.out.println("0,0");
return;
}

//分割命令
String[] subS = s.split(";");
if (subS == null || subS.length == 0) {
System.out.println("0,0");
return;
}

//命令的正则匹配
String pattern = "[ADWS]\\d{1,2}";

//起始坐标
int[] index = new int[] {0, 0};

for (int i = 0; i < subS.length; i++) {
if (Pattern.matches(pattern, subS[i])) {
//方向
String direction = subS[i].substring(0, 1);
//移动距离
String position = subS[i].substring(1, subS[i].length());
int x = Integer.parseInt(position);

if ("A".equalsIgnoreCase(direction)) {
index[0] -= x;
}
if ("D".equalsIgnoreCase(direction)) {
index[0] += x;
}
if ("W".equalsIgnoreCase(direction)) {
index[1] += x;
}
if ("S".equalsIgnoreCase(direction)) {
index[1] -= x;
}
}
}
System.out.println(index[0] + "," + index[1]);
}
}
}
发表于 2024-08-04 16:30:20 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
            String a = in.nextLine();
            //先按题干用;切分
            String[] b = a.split(";");
            int z=0;
            int y=0;
            //遍历
            for(int i=0;i<b.length;i++){
                String c = b[i];
                //判断开头是否为ASDW,再判断后续是否为纯数字,都满足则进行位置计算
                if(c.startsWith("A")&&c.substring(1).matches("\\d*")){
                    int num = Integer.parseInt(c.substring(1));
                    z=z-num;
                }else if(c.startsWith("S")&&c.substring(1).matches("\\d*")){
                    int num = Integer.parseInt(c.substring(1));
                    y=y-num;
                }else if(c.startsWith("D")&&c.substring(1).matches("\\d*")){
                    int num = Integer.parseInt(c.substring(1));
                    z=z+num;
                }else if(c.startsWith("W")&&c.substring(1).matches("\\d*")){
                    int num = Integer.parseInt(c.substring(1));
                    y=y+num;
                }
            }
            System.out.println(z +","+ y);
   
    }
}
发表于 2024-08-01 17:08:51 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static class Coordinate{
        int x;
        int y;
        public Coordinate(){
            this.x=0;
            this.y=0;
        }

        public void move(char direction,int dist){
            switch(direction){
                case 'W':
                    this.y+=dist;
                    break;
                case 'S':
                    this.y-=dist;
                    break;
                case 'A':
                    this.x-=dist;
                    break;
                case 'D':
                    this.x+=dist;
                    break;
                default:
                    return;
            }
        }

        public String GetCoordinate(){
            StringJoiner sj=new StringJoiner(",");

            return sj.add(this.x+"").add(this.y+"").toString();
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        String s=sc.nextLine();

        System.out.println(GetResult(s));
    }

    //判断一个字符串是否为整数
    public static boolean isInteger(String str) {
        try {
            Integer.parseInt(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    public static String GetResult(String s){
        String[] cds=s.split(";");

        Coordinate Cd=new Coordinate();

        for(int i=0;i<cds.length;i++){
            //去掉第一个字符,看剩下的是否为一个整数
            if(!isInteger(cds[i].substring(1))){
                i++;
                continue;
            }
            else{
                char direction=cds[i].charAt(0);
                int dist=Integer.parseInt(cds[i].substring(1));
                Cd.move(direction,dist);
            }
        }

        return Cd.GetCoordinate();
    }
}

发表于 2024-07-16 17:35:42 回复(0)
判断是否为空,判断开头是否为合法操作,判断结尾是否为数字,没有判断是否存在AS7这种情况
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Map<Character, Integer> map = new HashMap<>();
        map.put('A', -1);
        map.put('D', 1);
        map.put('S', -1);
        map.put('W', 1);
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String source = in.next();
        String[] arr = source.split(";");
        int x = 0;
        int y = 0;
        for(int i = 0; i < arr.length; i ++) {
            // 判断坐标合法性
            String temp = arr[i].trim();
            if(temp.length() ==3||temp.length()==2) {//过滤空的
                char c = temp.charAt(0);
                if(temp.charAt(temp.length()-1)==' '||!(temp.charAt(temp.length()-1)<='9'&&temp.charAt(temp.length()-1)>='0'))
                {
                    continue;
                }
                if(map.containsKey(c)) {//操作符合ADWS
                    //读取后面两位的内容
                    //为啥不用判断是否是AKL,DA1这种的
                  
                   int num=0;
                    if(temp.length() ==3)
                    {
                        int s=Character.getNumericValue(temp.charAt(1));
                        int g=Character.getNumericValue(temp.charAt(2));
                        num=s*10+g;
                    }
                    else{
                         int s=Character.getNumericValue(temp.charAt(1));
                      
                        num=s;

                    }
                   
                    try {
                        int numValue = Integer.valueOf(num);//
                        if('A' == c || 'D' == c) {
                            x = x + map.get(c) * numValue;
                        }else {
                            y = y + map.get(c) * numValue;
                        }
                    } catch(Exception e) {
                        continue;
                    }
                }
            }
        }
        System.out.println(x+","+y);
    }
}

发表于 2024-07-05 23:34:46 回复(1)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Map<Character, Integer> map = new HashMap<>();
        map.put('A', -1);
        map.put('D', 1);
        map.put('S', -1);
        map.put('W', 1);
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String source = in.next();
        String[] arr = source.split(";");
        int x = 0;
        int y = 0;
        for(int i = 0; i < arr.length; i ++) {
            // 判断坐标合法性
            String temp = arr[i];
            if(temp.length() > 0) {
                char c = temp.charAt(0);
                if(map.containsKey(c)) {
                    //读取后面两位的内容
                    String num = temp.substring(1, temp.length());
                    try {
                        int numValue = Integer.valueOf(num);
                        if('A' == c || 'D' == c) {
                            x = x + map.get(c) * numValue;
                        }else {
                            y = y + map.get(c) * numValue;
                        }
                    } catch(Exception e) {
                        continue;
                    }
                }
            }
        }
        System.out.println(x+","+y);
    }
}

发表于 2024-07-04 17:37:10 回复(1)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            test(str);
        }
    }

    public static void test(String str) {
        String[] strArr = str.split(";");
        int a = 0;
        int b = 0;
        for (String s : strArr) {
            if (s.isEmpty()) {
                continue;
            }
            String c = s.substring(0, 1);
            int length =  s.length();
            String value = s.substring(1, length);
            if (!isDigit11(value)) {
                continue;
            }
            int step = Integer.valueOf(value);
            switch (c) {
                case "A":
                    a -= step;
                    break;
                case "S":
                    b -= step;
                    break;
                case "W":
                    b += step;
                    break;
                case "D":
                    a += step;
                    break;
            }
        }
        System.out.println(a + "," + b);
    }

    public static boolean isDigit11(String value) {
        if (value.equals(" ") || value.isEmpty()) {
            return false;
        }
        for (int i = 0; i < value.length(); i++) {
            if (!Character.isDigit(value.charAt(i))) {
                return false;
            }
        }
        return true;
    }

}


发表于 2024-07-02 12:50:56 回复(0)
注意修改牛客编译器里自动输入的 while (in.hasNextInt())要改成hasNext,否则用例不过。
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String[] input = in.nextLine().toLowerCase().split(";");
            
            int x = 0;
            int y = 0;

            char letter;
            long num;
            for(String tmp:input) {
                if(tmp==null || tmp.length()<=0) {
                    continue;
                }
                letter = tmp.charAt(0);
                try {
                    num = Long.parseLong(tmp.substring(1));
                } catch (Exception e) {
                    continue;
                }

                switch(letter) {
                    case 'a':
                        x -= num;
                        break;
                    case 's':
                        y -= num;
                        break;
                    case 'w':
                        y += num;
                        break;
                    case 'd':
                        x += num;
                        break;
                    default:
                        continue;
                }
            }

            System.out.println(x+","+y);
        }
    }
}

发表于 2024-06-16 16:56:18 回复(0)
感觉有点搞笑,一开始想直接过滤,发现根本过不了编译。说是方法不存在。但过了会儿又可以编译。。反复无常(非最佳实现,纯吐槽)
List<String> list = Arrays.stream(arr)
    .filter(o -> o != null && o.matches("[AWDS]\\d{1,2}"))
    .collect(Collectors.toList());


发表于 2024-05-29 17:57:05 回复(0)
import java.util.Scanner; 
import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String line;
        while ((line = br.readLine()) != null && !line.isEmpty()) {
            // 初始化横纵坐标 {x, y}
            int[] coord = {0, 0};
            // 初始化移动命令
            char command = 'N';
            int distance = -1;
            // 解析数据
            int offset = 0;
            for (int i = 0; i < line.length(); i++) {
                char c = line.charAt(i);
                // 结算!
                if (c == ';') {
                    if (distance != -1) {
                        clac(coord, command, distance);
                    }
                    offset = 0;
                    distance = -1;
                    continue;
                }
                if (offset == -1) {
                    continue;
                }
                // 第一个字符, 默认视为命令
                if (offset == 0) {
                    command = c;
                    offset++;
                    continue;
                }
                // 第二个字符, 如果符合范围, 默认视为个位数
                if (offset == 1 && (c >= '0' && c <= '9')) {
                    distance = c - '0';
                    offset++;
                    continue;
                }
                // 第三个字符, 如果符合范围, 可以百分百确定个位数和十位数的值
                if (offset == 2 && (c >= '0' && c <= '9')) {
                    distance = distance * 10 + (c - '0');
                    offset++;
                    continue;
                }
                // 本次指令解析出现了非法指令, 暂时屏蔽 offset, 直到下一次结算 ';' 时再重新恢复
                offset = -1;
                // 本次指令解析出现了非法指令, 重置 distance
                distance = -1;
            }
            System.out.println(coord[0] + "," + coord[1]);
        }
        
    }

    public static void clac(int[] coord, char command, int distance) {
        switch (command) {
            case 'A':
                coord[0] = coord[0] - distance;
                break;
            case 'D':
                coord[0] = coord[0] + distance;
                break;
            case 'W':
                coord[1] = coord[1] + distance;
                break;
            case 'S':
                coord[1] = coord[1] - distance;
        }
    }

}
总共提交结果:答案正确
运行时间:9ms
占用内存:9428KB
使用语言:Java
用例通过率:100.00%
发表于 2024-05-23 12:57:39 回复(0)
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String str = in.nextLine();
        String[] strArr = str.split(";");
        int[] p = {0, 0};
        for (String  s : strArr) {
            if (!isValid(s)) {
                continue;
            }
            String d = String.valueOf(s.charAt(0));
            int num = Integer.parseInt(s.replace(d, ""));
            if ("A".equals(d)) {
                p[0] = p[0] - num;
            } else if ("D".equals(d)) {
                p[0] = p[0] + num;
            } else if ("W".equals(d)) {
                p[1] = p[1] + num;
            } else {
                p[1] = p[1] - num;
            }
        }
        System.out.print(p[0]+","+p[1]);
    }

    private static boolean isValid(String s) {
        if (s == null || s.isEmpty()) {
            return false;
        }
        if (s.length() > 3) {
            return false;
        }

        if (!s.startsWith("A") && !s.startsWith("D") && !s.startsWith("S") &&
                !s.startsWith("W")) {
            return false;
        }
        char[] charArr = s.toCharArray();
        for (int i = 1; i < charArr.length; i++) {
            if (!Character.isDigit(charArr[i])) {
                return false;
            }
        }
        return true;
    }
}
发表于 2024-05-13 07:39:30 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        String[] strings = input.split(";");
        List<String> ops = new ArrayList<>();
        for (String str : strings) {
            if (str.matches("[WASD]\\d{1,2}")) {
                ops.add(str);
            }
        }
        int x = 0;
        int y = 0;
        for (String op : ops) {
            if (op.startsWith("A")) {
                x = x - Integer.parseInt(op.substring(1));
            }
            if (op.startsWith("D")) {
                x = x + Integer.parseInt(op.substring(1));
            }
            if (op.startsWith("W")) {
                y = y + Integer.parseInt(op.substring(1));
            }
            if (op.startsWith("S")) {
                y = y - Integer.parseInt(op.substring(1));
            }
        }
        System.out.println(x + "," + y);
    }
}
编辑于 2024-04-16 12:33:05 回复(0)
1. 合法性 A/W/S/D + 一个数字0 ~ 99 ,排行里面两位数字有很多人没有校验,竟然通过了。
2. 搞不懂这个执行时间相差这么多,有的人的代码跟我一样的逻辑,我的还更好一些,竟然没有他们运行地快,奇怪。
编辑于 2024-03-23 21:26:41 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int x = 0;
            int y = 0;
            String input = sc.next();
            String[] arr = input.split(";");
            for (String s : arr) {
                if (s.equals("") || s.length() < 2) {
                    continue;
                }
                String reg = "^[ADWS]{1}[0-9]{1,2}$";
                if (!s.matches(reg)) {
                    continue;
                }
                char direct = s.charAt(0);
                int dt = Integer.parseInt(s.substring(1));
                switch (direct) {
                    case 'A':
                        x = x - dt;
                        break;
                    case 'D':
                        x = x + dt;
                        break;
                    case 'W':
                        y = y + dt;
                        break;
                    case 'S':
                        y = y - dt;
                        break;
                    default:
                        continue;
                }
            }
            System.out.println(x + "," + y);
        }
    }
}

编辑于 2024-03-16 18:31:55 回复(0)
import java.util.*;

class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        int r1 = 0, r2 = 0;
        String[] arr = str.split(";");
        for (String t : arr) {
            if (t.length() < 2 || t.length() > 3) {
                continue;
            }
            int s = 0;
            if (t.charAt(1) >= '0' && t.charAt(1) <= '9')  {
                s = t.charAt(1) - '0';
                if (t.length() > 2 && t.charAt(2) >= '0' && t.charAt(2) <= '9')  {
                    s *= 10;
                    s += t.charAt(2) - '0';
                } else if(t.length() > 2){
                    continue;
                }
            } else {
                continue;
            }
            switch (t.charAt(0)) {
                case 'A': r1 -= s;break;
                case 'D': r1 += s;break;
                case 'W': r2 += s;break;
                case 'S': r2 -= s;break; 
            }
        }
        System.out.println(r1 + "," + r2);
    }

}

编辑于 2024-03-15 21:14:30 回复(0)
想不起正则怎么写的我,认真说,同样是中等难度,这道题和上一个背包算法的那个完全不是一个量级
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int x = 0;
        int y = 0;
        String par = in.nextLine();
        if (par != null && par.length() > 0) {
            String[] values = par.split(";");
            for (String v : values) {
                if (v != null && v.length() > 1) {
                    String a = v.substring(0, 1);
                    String b = v.substring(1, v.length());
                    try {
                        int c = Integer.parseInt(b);
                        switch (a) {
                            case "A" :
                                x = x - c;
                                break;
                            case "D" :
                                x = x + c;
                                break;
                            case "W" :
                                y = y + c;
                                break;
                            case "S" :
                                y = y - c;
                                break;
                            default:
                                break;
                        }
                    } catch (Exception e) {
                    }
                }
            }
        }
        System.out.print(x + "," + y);

    }
}


编辑于 2024-03-15 10:52:19 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String inputStr =  in.nextLine();
        String[] strArr = inputStr.split(";");
        int x = 0;
        int y = 0;
        int v = 0;
        char direct;
        for (int i = 0; i < strArr.length; i++) {
            if (strArr[i].length() > 1) {
                direct = strArr[i].charAt(0);
                try {
                    v = Integer.parseInt(strArr[i].substring(1, strArr[i].length()).trim());
                    switch (direct) {
                        case 'A':
                            x -= v;
                            break;
                        case 'D':
                            x += v;
                            break;
                        case 'W':
                            y += v;
                            break;
                        case 'S':
                            y -= v;
                            break;
                        default:
                    }
                } catch (Exception e) {
                    continue;
                }
            }
        }
        System.out.println(x + "," + y);
    }
}

编辑于 2024-01-03 16:48:58 回复(0)