Estoy tratando de resolver este problema: https://projecteuler.net/problem=11 Sin embargo, esta parte me confunde:
¿Cuál es el mayor producto de cuatro números adyacentes en la misma dirección (arriba, abajo, izquierda, derecha o diagonal) en la cuadrícula de 20×20?
¿Qué significa in the same direction y up, down, left, right or diagonally ? ¿Soy solo yo o el lenguaje es vago aquí?
esto es lo que he intentado hasta ahora:
long int prod{0}, n{20}; for(int i{0}; i <= n; i++) { for(int j{0}; j <= n; j++) { long int a{grid[i][j]}, b{grid[i+1][j+1]}, c{grid[i+2][j+2]}, d{grid[i+3][j+3]}; if(prod < (a * b * c * d)) prod = a * b * c * d; } } return prod; Con esta función satisfago la primera demanda pero arriba abajo izquierda derecha o en diagonal? ¿Qué significa or significa allí?
Una dirección en el contexto de una cuadrícula es el espacio geométrico cuyos puntos están todos en la misma línea.
Si tomamos un punto, entonces podemos cruzarlo con 4 líneas diferentes:
\ | / \ | / \ | / \|/ ----*---- /|\ / | \ / | \ / | \Entonces, ¿cómo podríamos definir estas direcciones? Hay una forma muy sencilla de hacerlo:
Digo "intentar", lo que significa que tendrá que ignorar bastantes posibilidades debido a los límites de su cuadrícula. Sin embargo, es una buena manera de obtener las cuatro direcciones:
int bestProduct = -1; //Assuming you have positives for (int row = 0; row < n; row++) { for (int column = 0; column < n; column++) { int ignore = 0; int rowDir = 0; int colDir = 1; int product = grid[row][column]; for (int index = 0; (!ignore) && (index < 3); index++) { if ( (row + rowDir < 0) || (row + rowDir >= n) || (column + colDir < 0) || (column + colDir >= m) ) { ignore = 1; } else product *= grid[row + rowDir][column + colDir]; } if ((!ignore) && (bestProduct < product)) bestProduct = product; } }Esta no es una implementación completa, ya que también necesita hacer algo de trabajo. Deberá continuar con:
if condicional, que verifica si el producto es más alto que el mejor producto hasta el momentocolDir y 0 rowDircolDir y 1 rowDircolDir y -1 rowDirSé que es más difícil considerar esta solución parcial, pero a la larga te ayudará mucho si haces el resto por ti mismo, ya que las ideas están todas establecidas aquí.
Debe verificar cada fila, columna y diagonal de 4. Esto significa que debe verificar:
from grid[i-4][j] to grid[i][j] from grid[i][j-4] to grid[i][j] from grid[i-4][j-4] to grid[i][j] (diagonal) from grid[i+4][j-4] to grid[i][j] (other diagonal)Asegúrese de observar los lados de la cuadrícula también, ya que si está en el extremo izquierdo, deberá mirar hacia la derecha.