开始写就真的像个傻子一样,每一步改怎么走,分了四个方向…
class Solution {
public:
int minTimeToVisitAllPoints(vector<vector<int>>& points) {
int count = 0;
vector<vector<int>> temp = points;
for(int i=1;i<points.size();i++)
{
if(temp[i-1]!=points[i])
{
if(temp[i-1][0]<=points[i][0]&&temp[i-1][1]<=points[i][1])
{
while(temp[i-1][0]<points[i][0]&&temp[i-1][1]<points[i][1])
{temp[i-1][0]++;temp[i-1][1]++;count++;}
while(temp[i-1][0]<points[i][0]) {temp[i-1][0]++;count++;}
while(temp[i-1][1]<points[i][1]) {temp[i-1][1]++;count++;}
}
if(temp[i-1][0]>=points[i][0]&&temp[i-1][1]>=points[i][1])
{
while(temp[i-1][0]>points[i][0]&&temp[i-1][1]>points[i][1])
{temp[i-1][0]--;temp[i-1][1]--;count++;}
while(temp[i-1][0]>points[i][0]) {temp[i-1][0]--;count++;}
while(temp[i-1][1]>points[i][1]) {temp[i-1][1]--;count++;}
}
if(temp[i-1][0]>=points[i][0]&&temp[i-1][1]<=points[i][1])
{
while(temp[i-1][0]>points[i][0]&&temp[i-1][1]<points[i][1])
{temp[i-1][0]--;temp[i-1][1]++;count++;}
while(temp[i-1][0]>points[i][0]) {temp[i-1][0]--;count++;}
while(temp[i-1][1]<points[i][1]) {temp[i-1][1]++;count++;}
}
if(temp[i-1][0]<=points[i][0]&&temp[i-1][1]>=points[i][1])
{
while(temp[i-1][0]<points[i][0]&&temp[i-1][1]>points[i][1])
{temp[i-1][0]++;temp[i-1][1]--;count++;}
while(temp[i-1][0]<points[i][0]) {temp[i-1][0]++;count++;}
while(temp[i-1][1]>points[i][1]) {temp[i-1][1]--;count++;}
}
}
}
return count;
}
};
结果用的时间超长…这个题目其实就只需要累加每次走最短的时间就好了,所以我们可以看看这里有什么规律
有两个点a1(x1,y1) a2(x2,y2)
设dx = |x1-x2|,dy=|y1-y2|;
那么最小的路径,(如果可以)可以做个一三角形,发现走一个斜边=min(dx,dy),补上剩下的,也就是max(dx,dy)-min(dx,dy) 总共也就是max(dx,dy)
所以不要求怎么走的话,就可以这样写
class Solution {
public:
int minTimeToVisitAllPoints(vector<vector<int>>& points) {
int x1 = points[0][0], y1 = points[0][1];
int count = 0;
for (int i = 1; i < points.size(); ++i) {
int x2 = points[i][0], y2 = points[i][1];
count += max(abs(x1 - x2), abs(y1 - y2));
x1 = x2;
y1 = y2;
}
return count;
}
};