Jawa 149 160 karakter
Wajib: Karena ... Anda tahu ... Jawa! Bersenang-senang dengan Java di bawah 150 161 karakter:
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);}
Tidak digabung ke dalam kelas:
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);
}
}
Bagaimana itu bekerja
Pertama-tama ia menangkap case standar di mana kita tidak harus pindah ke mana pun.
Sekarang kita dapat mengasumsikan bahwa kedua bilangan bulat berbeda, sehingga hanya yang lebih kecil yang dapat 0. Jika demikian, kami menghitung jarak dari kunci 1 dan 2 ke kunci lainnya. Kami akan menggunakan yang dengan jarak yang lebih pendek dan menambahkan satu langkah untuk mendapatkan dari 1 atau 2 ke 0.
Jika kita tidak ingin pergi ke / dari nol kita hanya perlu bergerak di kisi 3x3. Kita dapat menentukan kolom dan baris kunci dengan menggunakan mod atau div masing-masing. Kemudian kita menghitung jarak kolom dan baris dan menambahkannya. Ini adalah jarak yang perlu kita dapatkan dari satu kunci ke kunci lainnya.
Saya harap penjelasannya bisa dimengerti, silakan main golf :)
Pembaruan
Harus mengubahnya menjadi fungsi aktual karena menggunakan rekursi yang tidak mungkin dengan lambdas:, (