Bouncy Ball
题意:
给一个n * m 的矩形和一个小球,小球的初始位置为(sx,sy),如果小球撞到墙壁,会以反弹。小球的初始方向为d,有四种方向:
“DR”,“DL”,“UR”,“UL”。其中D代表向下,U代表向上,R代表向右。
L代表向左。举个栗子,“DR"撞到下边界会反弹为"UR”,如果当前
的运动状态为"UR",那么下一步小球的位置为(sx - 1, sy + 1)。
问小球经过多少次反弹能到达(ex,ey)。如果不能到达,输出-1。
思路:
因为每个点有四种方向可以走,所以小球最多走4 * n * m次,所以只要模拟4 * n * m次运动即可。
代码:
/*************************************************************************
> File Name: a.cpp
> Author: Beans
> Mail: 3112748286@qq.com
> Created Time: 2023/5/12 13:03:36
************************************************************************/
#include <iostream>
#define int long long
#define endl '\n'
using namespace std;
int t, n, m, sx, sy, ex, ey;
string d;
int dx, dy;
void solve(){
cin >> n >> m >> sx >> sy >> ex >> ey >> d;
if(d[0] == 'D') dx = 1;
else dx = -1;
if(d[1] == 'R') dy = 1;
else dy = -1;
int ti = n * m * 4;
int ans = 0;
while(ti -- ){
if(sx == ex && sy == ey){
cout << ans << endl;
return;
}
bool ok = false;
if(sx == n && dx == 1){
dx = -1, ok = true;
}
if(sx == 1 && dx == -1){
dx = 1, ok = true;
}
if(sy == m && dy == 1){
dy = -1, ok = true;
}
if(sy == 1 && dy == -1){
dy = 1, ok = true;
}
sx += dx, sy += dy;
if(ok) ans ++ ;
}
cout << -1 << endl;
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> t;
while(t -- ) solve();
}