Algoritmenya sangat sederhana jika inputnya berupa bilangan bulat, cukup cari nilai absolut antara koordinat x dan y lalu jumlahkan keduanya. Ini disebut jarak Manhattan.
int distance = Math.abs(x1 - x2) + Math.abs(y1 - y2);
Dengan ganda, hampir persis sama, kecuali satu situasi. Berikut beberapa kemungkinannya:
- Kedua titik tersebut memiliki koordinat bilangan bulat
- Satu titik memiliki koordinat bilangan bulat, dan titik lainnya hanya memiliki satu koordinat bilangan bulat
- Kedua titik tersebut hanya mempunyai satu koordinat bilangan bulat, namun terletak pada sumbu yang berbeda.
- Kedua titik tersebut hanya mempunyai satu koordinat bilangan bulat dan berada pada sumbu yang sama.
Kemungkinan 1-3 semuanya berfungsi dengan baik menggunakan algoritma yang sama seperti untuk mencari jarak dengan bilangan bulat, kecuali #4 memiliki kemungkinan sumbu yang sama berada pada blok yang sama.
Misalnya, jika inputnya adalah: {x: 0.5, y: 2}
dan {x: 0.5, y: 3}
Anda harus melakukan perjalanan secara horizontal, vertikal, dan kemudian mundur lagi secara horizontal untuk mencapai tujuan. Ini berbeda dengan input {x: 0.5, y: 2}
dan {x: 1.5, y: 3}
karena tidak perlu melakukan perjalanan mundur pada sumbu yang sama.
Jadi Anda dapat menggunakan algoritma normal dalam semua kasus kecuali ketika kedua X atau Y memiliki nilai floating-point dan memiliki nilai floor
-ed yang sama.
Kode Anda akan terlihat seperti ini.
import static java.lang.Math.*;
public static double perfectCity(double x1, double y1, double x2, double y2) {
double xDist = abs(x1 - x2);
double yDist = abs(y1 - y2);
if (floor(x1) != x1 && floor(x2) != x2 && // both Xs are doubles
floor(x1) == floor(x2) && // on the same block
y1 != y2) { // not on the same street
xDist = min(abs(x1 - floor(x1) + x2 - floor(x2)),
abs(x1 - ceil(x1) + x2 - ceil(x2)));
} else if (floor(y1) != y1 && floor(y2) != y2 && // both Ys are doubles
floor(y1) == floor(y2) && // on the same block
x1 != x2) { // not on the same street
yDist = min(abs(y1 - floor(y1) + y2 - floor(y2)),
abs(y1 - ceil(y1) + y2 - ceil(y2)));
}
return xDist + yDist;
}
Hal ini dapat disederhanakan lebih lanjut dengan menggunakan fungsi pembantu untuk menghitung setiap sumbu secara terpisah.
public static double perfectCity(double x1, double y1, double x2, double y2) {
return travelOnAxis(x1, x2, y1 == y2) + travelOnAxis(y1, y2, x1 == x2);
}
private static double travelOnAxis(double from, double to, boolean travelIsStraight) {
if (Math.floor(from) == Math.floor(to) && !travelIsStraight) {
double dist = Math.abs((from % 1) + (to % 1));
return Math.min(dist, 2 - dist);
} else {
return Math.abs(from - to);
}
}
Saya menggunakan trik dengan 2 - dist
disini karena sama saja dengan menghitung
Math.abs((1 - (from % 1)) + (1 - (to % 1)))
yang sama dengan
Math.abs(from - Math.ceil(from) + to - Math.ceil(to))
person
4castle
schedule
01.08.2016
double x1, double y1, double x2, double y2
. Atau buat kelasPoint
, dan berikan bidangx
dany
. - person 4castle   schedule 01.08.2016