อัลกอริทึมนั้นง่ายมากหากอินพุตเป็นจำนวนเต็ม เพียงค้นหาค่าสัมบูรณ์ระหว่างพิกัด x และ y แล้วบวกเข้าด้วยกัน ซึ่งเรียกว่าระยะทางแมนฮัตตัน
int distance = Math.abs(x1 - x2) + Math.abs(y1 - y2);
เมื่อใช้คู่ก็เกือบจะเหมือนกันทุกประการ ยกเว้นในสถานการณ์เดียว นี่คือความเป็นไปได้บางประการ:
- ทั้งสองจุดมีพิกัดจำนวนเต็ม
- จุดหนึ่งมีพิกัดจำนวนเต็ม และอีกจุดมีพิกัดจำนวนเต็มเพียงจุดเดียวเท่านั้น
- ทั้งสองจุดมีพิกัดจำนวนเต็มเพียงจุดเดียว แต่อยู่บนแกนต่างกัน
- จุดทั้งสองมีพิกัดจำนวนเต็มเพียงจุดเดียวและอยู่บนแกนเดียวกัน
ความเป็นไปได้ที่ 1-3 ทั้งหมดทำงานได้ดีโดยใช้อัลกอริธึมเดียวกันกับการค้นหาระยะทางด้วยจำนวนเต็ม ยกเว้น #4 มีความเป็นไปได้ที่แกนร่วมจะอยู่บนบล็อกเดียวกัน
ตัวอย่างเช่น หากอินพุตเป็น: {x: 0.5, y: 2}
และ {x: 0.5, y: 3}
คุณจะต้องเดินทางในแนวนอน แนวตั้ง และถอยหลังในแนวนอนอีกครั้งเพื่อไปยังจุดหมายปลายทาง สิ่งนี้แตกต่างจากอินพุต {x: 0.5, y: 2}
และ {x: 1.5, y: 3}
เนื่องจากไม่จำเป็นต้องเคลื่อนที่ถอยหลังบนแกนเดียวกัน
ดังนั้น คุณสามารถใช้อัลกอริธึมปกติได้ในทุกกรณี ยกเว้น ในกรณีที่ Xs หรือ Y ทั้งคู่มีค่าจุดลอยตัวและมีค่า floor
-ed เท่ากัน
รหัสของคุณควรมีลักษณะเช่นนี้
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;
}
ซึ่งสามารถทำให้ง่ายขึ้นได้อีกมากโดยใช้ฟังก์ชันตัวช่วยในการคำนวณแต่ละแกนแยกกัน
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);
}
}
ฉันใช้เคล็ดลับกับ 2 - dist
ที่นี่เพราะมันเหมือนกับการคำนวณ
Math.abs((1 - (from % 1)) + (1 - (to % 1)))
ซึ่งก็เหมือนกับ
Math.abs(from - Math.ceil(from) + to - Math.ceil(to))
person
4castle
schedule
01.08.2016
double x1, double y1, double x2, double y2
หรือสร้างคลาสPoint
และกำหนดฟิลด์x
และy
- person 4castle   schedule 01.08.2016