Java 149 160 ký tự
Điều bắt buộc: Bởi vì ... bạn biết ... Java! Vui chơi với Java dưới 150 161 ký tự:
int d(int f,int t){if(f==t)return 0;if(Math.min(f,t)==0){int m=Math.max(f,t);return Math.min(d(1,m),d(2,m))+1;}return Math.abs(--t%3- --f%3)+Math.abs(t/3-f/3);}
Ungolfed vào một lớp học:
public class Q80357 {
static int distance(int from, int to) {
if (from == to)
return 0;
if (Math.min(from, to) == 0) {
int max = Math.max(from, to);
return Math.min(distance(1, max), distance(2, max)) + 1;
}
return Math.abs(--to % 3 - --from % 3) + Math.abs(to / 3 - from / 3);
}
}
Làm thế nào nó hoạt động
Đầu tiên, nó bắt được trường hợp tiêu chuẩn mà chúng ta không phải di chuyển bất cứ nơi nào.
Bây giờ chúng ta có thể giả sử rằng cả hai số nguyên khác nhau, do đó chỉ có số nguyên nhỏ hơn có thể bằng 0. Nếu đây là trường hợp chúng ta tính khoảng cách từ khóa 1 và 2 đến khóa khác. Chúng tôi sẽ sử dụng một với khoảng cách ngắn hơn và thêm một bước để có được từ 1 hoặc 2 đến 0.
Nếu chúng ta không muốn đi đến / từ số 0, chúng ta chỉ phải di chuyển trong lưới 3x3. Chúng ta có thể xác định cột và hàng của khóa bằng cách sử dụng mod hoặc div tương ứng. Sau đó, chúng tôi tính toán khoảng cách cột và hàng và thêm chúng. Đây là khoảng cách chúng ta cần để đi từ khóa này đến khóa khác.
Tôi hy vọng lời giải thích có thể được hiểu, hãy chơi golf :)
Cập nhật
Phải thay đổi nó thành một hàm thực tế vì nó sử dụng đệ quy không thể có với lambdas :, (