大家好,我是晴天学长,这是一个动态模拟题,跟大佬相比,我的有点繁琐了,但是也算是锻炼到自己的一些细节问题,需要的小伙伴可以关注支持一下哦!后续会继续更新的。
1) .判断能否在给定时间到达单元格
2) .算法思路
判断能否在给定时间到达单元格
1.对角线永远是最快的
2.所以算出至少要多少秒,就知道能不能恰好到达了。
3.判定
1.当不在一条直线上,直接走对角线(作图直接减坐标,就理解一些)
终点在右上方,左上方
x++,y-- x-- y–
重点在右下方 左下方
x++ y++ x-- y++
2.当在一条直线上时,直接ans+=距离
3) .算法步骤
首先,进行一些边界判断,如果时间 t 为0,则判断起点和终点是否相同,相同则返回true,不同则返回false。
如果起点和终点相同,且时间 t 为1,则返回false;否则返回true。
初始化变量 time 为0,表示移动的总时间。
根据起点和终点的位置关系,确定移动的方向。根据起点和终点的横坐标和纵坐标的大小关系,设置变量 dx 和 dy 的值,表示移动的方向。
根据移动的方向,计算移动的时间,即取横坐标和纵坐标之差的绝对值的较小值,并将起点的坐标更新为移动后的位置。
如果起点的横坐标与终点的横坐标相等,但纵坐标不相等,则将移动的时间加上终点纵坐标与起点纵坐标之差的绝对值。
如果起点的纵坐标与终点的纵坐标相等,但横坐标不相等,则将移动的时间加上终点横坐标与起点横坐标之差的绝对值。
判断移动的总时间是否小于等于给定的时间 t,如果是则返回true,否则返回false。
4).代码示例
class Solution {
static int[] dxtemp = {1, -1};
static int[] dytemp = {1, -1};
public boolean isReachableAtTime(int sx, int sy, int fx, int fy, int t) {
if (t==0){
if (sx==fx&&sy==fy){
return true;
}
else {
return false;
}
}
if (sx==fx&&sy==fy){
if (t==1){
return false;
}
else {
return true;
}
}
long time = 0;
//对角线的偏移量
int dx = 0;
int dy = 0;
//判断方位
//右边
if (sx < fx) {
if (sy < fy) {
dx = dxtemp[0];
dy = dytemp[0];
} else {
dx = dxtemp[0];
dy = dxtemp[1];
}
}
//左边
else if (sx > fx) {
if (sy < fy) {
dx = dxtemp[1];
dy = dytemp[0];
} else {
dx = dxtemp[1];
dy = dxtemp[1];
}
} else {
if (sx == fx) {
if (Math.abs(fy - sy) <= t) {
return true;
} else {
return false;
}
} else {
if (Math.abs(fx - sx) <= t) {
return true;
} else {
return false;
}
}
}
// 开始移动
time = Math.min(Math.abs(fx-sx), Math.abs(fy-sy));
sx +=time*dx;
sy +=time*dy;
time += sx == fx && sy!=fy ? Math.abs(fy - sy) : 0;
time += sy == fy && sx!=fx ? Math.abs(fx - sx) : 0;
if (time <= t) {
return true;
} else {
return false;
}
}
}
5).总结
- 细节问题
试题链接: