#P2736. 第1题-推箱子
-
1000ms
Tried: 70
Accepted: 33
Difficulty: 2
所属公司 :
拼多多
时间 :2025年3月23日-算法岗
-
算法标签>模拟
第1题-推箱子
题解
题面描述
题目要求我们判断箱子经过一系列移动后是否恰好到达坐标 (0,0)。
- 初始时箱子的坐标为 (x,y),其中 −10000≤x,y≤10000。
- 输入一个字符串 S,字符串中的字符可以是 W、A、S、D,分别代表向上、向左、向下、向右移动。
- 每个操作会使坐标按如下方式变化:
- W:(x,y)→(x,y+1)
- A:(x,y)→(x−1,y)
- S:(x,y)→(x,y−1)
- D:(x,y)→(x+1,y)
- 对于每组测试用例,如果最终箱子的位置为 (0,0) 则输出 YES,否则输出 NO。
思路
这道题的核心在于模拟箱子的移动过程。每个操作(W、A、S、D)会改变箱子的坐标,通过对操作字符串的遍历,统计每个方向(上、下、左、右)的移动次数。根据这些统计值,我们可以计算出箱子的最终坐标,并判断是否恰好到达目标坐标(0, 0)。如果到达,输出 "YES",否则输出 "NO"。
- 对于每组测试用例,首先读入初始坐标 (x,y)。
- 遍历字符串 S,统计每个方向的移动次数:
- 向上次数记为 countW
- 向下次数记为 countS
- 向左次数记为 countA
- 向右次数记为 countD
- 箱子的横坐标变化为 countD−countA,纵坐标变化为 countW−countS。
- 将这两个变化分别加到初始的 x 和 y 上,得到最终坐标 (x′,y′)。
- 若 x′=0 且 y′=0,则输出 YES,否则输出 NO。
C++ 代码
#include <iostream>
#include <string>
using namespace std;
int main() {
int T;
cin >> T; // 读入测试用例数量
while(T--) {
int x, y;
cin >> x >> y; // 读入箱子的初始坐标 (x,y)
string S;
cin >> S; // 读入操作字符串
// 初始化方向计数器
int countW = 0, countA = 0, countS = 0, countD = 0;
for(char c : S) {
if(c == 'W') countW++;
else if(c == 'A') countA++;
else if(c == 'S') countS++;
else if(c == 'D') countD++;
}
// 计算最终坐标
int finalX = x + (countD - countA);
int finalY = y + (countW - countS);
// 判断是否到达 (0,0)
if(finalX == 0 && finalY == 0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
Python 代码
# 读入测试用例数量
T = int(input().strip())
for _ in range(T):
# 读入箱子的初始坐标 (x, y)
x, y = map(int, input().split())
# 读入操作字符串
S = input().strip()
# 初始化方向计数器
count_W = S.count('W')
count_A = S.count('A')
count_S = S.count('S')
count_D = S.count('D')
# 计算最终坐标
final_x = x + (count_D - count_A)
final_y = y + (count_W - count_S)
# 判断是否到达 (0,0)
if final_x == 0 and final_y == 0:
print("YES")
else:
print("NO")
Java 代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt(); // 读入测试用例数量
while(T-- > 0) {
int x = sc.nextInt(); // 读入箱子的初始坐标 x
int y = sc.nextInt(); // 读入箱子的初始坐标 y
String S = sc.next(); // 读入操作字符串
int countW = 0, countA = 0, countS = 0, countD = 0;
// 遍历字符串统计各方向操作次数
for(int i = 0; i < S.length(); i++) {
char c = S.charAt(i);
if(c == 'W') countW++;
else if(c == 'A') countA++;
else if(c == 'S') countS++;
else if(c == 'D') countD++;
}
// 计算最终坐标
int finalX = x + (countD - countA);
int finalY = y + (countW - countS);
// 判断是否到达 (0,0)
if(finalX == 0 && finalY == 0)
System.out.println("YES");
else
System.out.println("NO");
}
sc.close();
}
}
题目内容
多多最近在玩一个推箱子游戏,在一个二维坐标中,箱子的起坐标是(x,y),多多有四个方向键可以操作:
-
W:将箱子向上移动,即:(x,y)−>(x,y+1)
-
A:将箱子向左移动,即:(x,y)−>(x−1,y)
-
S: 将箱子向下移动,即:(x,y)−>(x,y−1)
-
D:将箱子向右移动,即:(x,y)−>(x+1,y)
在经过多多一系列按键操作后,如果恰好最终箱子的位置恰好在(0,0)就算赢了,请你帮忙计算多多是否能赢。
输入描述
第一行,包含一个数字T(1<=T<=100),表示T组测试用例。
接下来,对于每组测试用例,输入有2行:
第1行包含两个数字x和y,表示箱子的起始坐标(x,y)。−10000≤x,y≤10000
第2行包含一个字符串S(由W、A、S、D这4个字母组成),记录了多多的一系列移动操作。字符串的长度大于0且不超过10000
输出描述
对于每组测试用例,输出一个字符串:"YES"表示赢了,"NO"表示没有赢。
样例1
输入
2
2 0
WAS
1 0
WAADS
输出
NO
YES
说明
有2组测试用例:
对于第1组用例,起始位置是(2,0),经过W、A、S操作后,位置的变化过程是:−>(2,1)−>(1,1)−>(1,0),最终位置是(1,0),所以没有赢,输出NO。
对于第2组测试用例,初始位置是(1,0),经过W、A、A、D、S操作后,位置的变化过程是:−>(1,1)−>(0,1)−>(−1,1)−>(0,1)−>(0,0),最终位置是(0,0),所以赢了,输出YES。