题目:小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.字符串的灵活处理;
网友评论