En las Damas chinas , una pieza puede moverse saltando sobre cualquier otra pieza, o haciendo una secuencia de tales saltos. Su tarea es encontrar la secuencia más larga posible de saltos.
Entrada
Una secuencia de 121 ceros o unos, cada uno representando un lugar en un tablero. Un cero significa que el lugar está vacío; uno significa que el lugar está ocupado. Las posiciones se enumeran de izquierda a derecha; de arriba hacia abajo. Por ejemplo, la entrada de esta configuración sería
1011110011000001000000000000000000000000100000000001000000000000000000000000000001000000000000000000000001000001100111111
Explicación:
El lugar superior está ocupado por una pieza verde, por lo que el primer dígito en la entrada es
1
. La segunda fila tiene una posición vacía y luego una posición ocupada, entonces01
viene la siguiente. La tercera fila está ocupada, entonces111
. La cuarta fila tiene dos espacios vacíos y dos espacios ocupados (de izquierda a derecha), entonces0011
. Luego vienen cinco0
, a1
y siete0
para la siguiente fila, y así sucesivamente.
Al igual que en esa configuración, hay una esquina apuntando hacia arriba. Puede haber cualquier cantidad de piezas en el tablero (de 1 a 121). Tenga en cuenta que las piezas de diferentes colores no se representan de manera diferente.
Salida
La longitud máxima de un salto legal, usando cualquier pieza en el tablero. No puede visitar el mismo lugar más de una vez (incluidas las posiciones inicial y final). Sin embargo, puede saltar sobre la misma pieza más de una vez. Si no hay salto legal, salida 0
. No considere si existe un movimiento legal sin salto.
Por ejemplo, la salida a la configuración descrita anteriormente es 3
.
La entrada y salida se pueden realizar a través de stdin y stdout, a través de argumentos de línea de comandos, a través de llamadas a funciones o cualquier método similar.
Casos de prueba
Entrada:
0100000010000000000000000100000000000000000000000000000001010010000000000000000000000101000000000000000000100000000100001
Salida: 0
(no hay dos piezas una al lado de la otra)
Entrada:
0000000000111100000000011100000000011000000000100000000000000000000000000000000000000000000000000000000000000000000000000
Salida: 1
(configuración inicial para un jugador en la esquina superior izquierda)
fuente
Respuestas:
Perl,
345322Editar: golf, un poco.
Sería bueno tener más casos de prueba, pero por ahora parece que funciona. Agregaré comentarios más tarde si es necesario. Con nuevas líneas y sangría para facilitar la lectura:
fuente
C,
262260Código de golf ( código de depuración y espacios en blanco innecesarios eliminados. Cambió de entrada a través de stdin a entrada a través de la línea de comando, y aprovechó la oportunidad para declarar la variable i allí. Última edición: el código se movió entre paréntesis de
for
bucles para guardar dos puntos y coma).Explicación
Esto se basa en un tablero de 20x21 que se ve así, inicialmente lleno de ceros cuando se inicia el programa (este arte ASCII fue generado por una versión modificada del programa, y como el
i
bucle cuenta hacia abajo, el cero está en la esquina inferior derecha):El bucle
i
recorre este tablero dos veces, usando x e y para calcular si un cuadrado pertenece realmente al tablero de ajedrez o no (esto requiere 6 desigualdades separadas en x e y).Si lo hace, la primera vez llena los cuadrados, colocando un
0
(falso) para un1
(ocupado) y un1
(verdadero) para un0
(desocupado). Esta inversión es importante, porque todos los cuadrados fuera de límites ya contienen un 0, lo que significa que se parecen a los cuadrados ocupados y está claro que no se pueden saltar, sin la necesidad de una verificación específica.La segunda ronda, si el cuadrado está ocupado (contiene 0), llama a la función
f
que busca los movimientos.f
busca recursivamente en las 6 direcciones posibles codificadas por +/- 1 (horizontal), +/- 20 (vertical) y +/- 19 (diagonal) codificadas en la expresión"AST?-,"[k]-64
. Cuando encuentra un hit, establece esa celda en 0 (ocupada) antes de llamarse recursivamente, luego la vuelve a establecer en 1 (vacía) cuando se devuelve la función. El valor de la celda debe cambiarse antes de la llamada recursiva para evitar saltar en esa celda más de una vez.Código sin golf
fuente