矩形游戏-(字节跳动2018)

2019-01-25  本文已影响0人  天使的流浪

题目:小a在玩一个很简单的游戏,游戏的内容是控制一个小人在一块矩形的空地内走,一旦小人走出矩阵范围,游戏就失败。游戏机有上,下,左,右四个按键,每按一下小人就向相应的方向走一步。这个游戏过于简单,小a说:“这种游戏我闭着眼睛玩都输不了”。于是他便闭上眼睛,进行一连串的操作。但若他中途输了的话就会停止。
那么问题来了:给定小a的操作,进行Q次询问,你能算出每次询问小人能走多少步吗。
输入描述:
第一行为长度L的字符串S,每个字符依次代表小a的一次操作。’u’代表向上,’d’代表向下,’l’代表向左,’r’代表向右。字符串S不会包含其他字符。
第二行是整数Q,代表Q次询问
接下来Q行,每行有四个整数,N,M,X,Y,保证1<=X<=N,1<=Y<=M,矩阵大小为N*M,小人初始位置为(X, Y)。
输出描述:
每次询问打印一个整数s(单独一行),代表小人所走的步数;
输入:
uuurrdddddl
3
5 6 3 3
5 6 4 2
6 6 4 2
输出:
3
10
11
分析:
1.行走的描述
'u':向上,x--; 'r':向右,y++;
'd':向下,x++; 'l':向左,y--;
2.边界的检查
N(矩形大小的横坐标),M(矩阵大小的纵坐标),X(初始位置的横坐标),Y(初始位置的纵坐标)
X>N || Y>M || X<1 || Y<1
3.数据的存储
如何存储行走的步骤?
如何存储每次询问数据?
如何存储结果数据?
代码实现:

package com.bj.zijietiaodong;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test2 {
    // 判断当前位置是否是合法的坐标
    public static boolean checkVaild(int data_x, int data_y, int x, int y){
        boolean flag = true;
        // 根据边界判断是否有效
        if (x>data_x || y>data_y || x<1 || y<1) {
            flag = false;
        }
        return flag;
    }
    //模拟实现行走
    private static int stempNum(int data_x, int data_y, int x, int y, String str) {
        if (str.length()==0) return 0;
        int step_num = 0;
        for (int i = 0; i < str.length(); i++) {
            if (checkVaild(data_x,data_y,x,y)) {
                step_num++;
                // 根据每一次行走修改位置
                if (str.charAt(i)=='u') {
                    x--;
                }else if (str.charAt(i)=='r') {
                    y++;
                }else if (str.charAt(i)=='d') {
                    x++;
                }else if (str.charAt(i)=='l') {
                    y--;
                }else {
                    System.out.println("输入字符为非法字符!");
                    return 0;
                }
            }else {
                return step_num;
            }
        }
        return step_num;
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //1.存储字符串
        String str = scan.nextLine();
        //2.存储Q次询问
        int num = Integer.parseInt(scan.nextLine());
        //3.存储Q次询问的结果(先以num=1实现)
        List<String> list_data = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            list_data.add(scan.nextLine());
        }
        //4.分别调用函数,存储结果值
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < list_data.size(); i++) {
            list.add(stempNum(Integer.parseInt(list_data.get(i).split(" ")[0]),Integer.parseInt(list_data.get(i).split(" ")[1]),
                    Integer.parseInt(list_data.get(i).split(" ")[2]),Integer.parseInt(list_data.get(i).split(" ")[3]),str));
        }
        scan.close();
        for (int j = 0; j < list.size(); j++) {
            System.out.println(list.get(j));
        }
    }
}

结果

uuurrdddddl
3
5 6 3 3
5 6 4 2
6 6 4 2
3
10
11

知识点:
1.集合的使用,如List,ArrayList等;
2.字符串的灵活处理;

上一篇下一篇

猜你喜欢

热点阅读