Estoy practicando para la próxima competencia de programación de ACM en una semana y me he quedado perplejo con este problema de programación.Problema de ACM: Coin-Flipping, ayúdame a identificar el tipo de problema que es
El problema es el siguiente:
Tienes un puzzle que consiste en una rejilla cuadrada de tamaño 4. Cada cuadrado de la cuadrícula tiene una sola moneda; cada moneda muestra cabezas (H) y colas (T). Uno de tales rompecabezas se muestra aquí:
H H H H
T T T T
H T H T
T T H T
Cualquier moneda que es actual, mostrando las colas (T) puede ser volteado para Jefes (H). Sin embargo, cada vez que volteamos una moneda, también debemos voltear las monedas adyacentes directamente arriba, abajo y hacia la izquierda y derecha en la misma fila. Por lo tanto, si volteamos la segunda moneda en la segunda fila también debemos voltear otras 4 monedas, dándonos este arreglo (las monedas que cambiaron se muestran en negrita).
H T HH
HHH T
H H HT
TTHT
Si una moneda está en el borde del rompecabezas, para que no haya monedas en un lado o en el otro, entonces tiramos menos monedas. No nos "envolvemos" al otro lado. Por ejemplo, si nos volteado la moneda inferior derecha de la arragnement anterior obtendríamos:
HtHh
HHHT
HHH H
TT TH
Nota : Solo se pueden seleccionar monedas que muestren (T) colas para voltear. Sin embargo, cada vez que volteamos una moneda de este tipo, las monedas adyacentes también se voltean, independientemente de su estado.
El objetivo del rompecabezas es que todas las monedas muestren cabezas. Si bien es posible que algunos arreglos no tengan soluciones, todos los problemas brindados tendrán soluciones. La respuesta que estamos buscando es, para cualquier cuadrícula de monedas 4x4 determinada, cuál es el menor número de volteos para hacer que la grilla se dirija por completo.
Por ejemplo, la cuadrícula:
H T H H
T T T H
H T H T
H H T T
La respuesta a esta rejilla es: 2 lanzamientos.
Lo que he hecho hasta ahora:
Estoy almacenando nuestras redes como matriz bidimensional de booleanos. Cabezas = verdadero, cruz = falso. Tengo flip (int fila, int col) método que invertirá las monedas adyacentes según las reglas anteriores y tengo isSolved() método que determinará si el rompecabezas está en un estado resuelto (todas las cabezas) . Entonces tenemos nuestra "mecánica" en su lugar.
La parte con la que estamos teniendo problemas es ¿cómo debemos atravesarla, yendo un mínimo de veces?
"Apaga las luces" con un ligero giro, frío. – avgbody
Esto podría ayudar, si necesita ver los cálculos. http://www.geocities.com/jaapsch/puzzles/lomath.htm#litonly – avgbody
¿Este problema está en línea? – kiewic