Java 149 160 caracteres
Lo obligatorio: porque ... ya sabes ... ¡Java! Divirtiéndose con Java en menos de 150 161 caracteres:
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);}
Sin golfista en una clase:
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);
}
}
Cómo funciona
Primero capta el caso estándar donde no tenemos que movernos a ningún lado.
Ahora podemos suponer que ambos enteros difieren, por lo que solo el más pequeño puede ser 0. Si este es el caso, calculamos la distancia desde la tecla 1 y 2 a la otra tecla. Usaremos el que tenga la distancia más corta y agregaremos un paso para pasar de 1 o 2 a 0.
Si no queremos ir a / desde cero, solo tenemos que movernos en la cuadrícula de 3x3. Podemos determinar la columna y la fila de la clave usando mod o div respectivamente. Luego calculamos la distancia entre columnas y filas y las sumamos. Esta es la distancia que necesitamos llegar de una tecla a otra.
Espero que la explicación se pueda entender, siéntase libre de jugar al golf :)
Actualizaciones
Tuve que cambiarlo a una función real, ya que usa la recursión que no es posible con lambdas:, (