Distancia de movimiento de C ++ (simulación, enumeración)

Los edificios de la zona residencial del Planeta X son todos iguales y están dispuestos en un patrón de matriz.
El número de edificios es 1, 2, 3 ...
Cuando una fila está llena, los números se ordenan en la dirección opuesta a los edificios adyacentes en la siguiente fila.
Por ejemplo: cuando la anchura número de la comunidad es 6
, la situación de partida es la siguiente:
1 2 3 4 5 6
12 11 10 9 8 7
13 14 15 ...
nuestro problema es: dos números edificio M
y N son conocidos , y tenemos que pregunte por ellos. La distancia de movimiento más corta entre ellos (no se puede mover en diagonal).
Formato de
entrada Introduzca una línea, incluidos tres números enteros w, m, n, w es el ancho del número de fila, m, n es el número de edificio que se calculará.
Formato de
salida Muestra un número entero, que representa la distancia de movimiento más corta entre my n.
Rango de datos
1≤w, m, n≤10000,
ejemplo de entrada:
6 8 2
ejemplo de salida:
4

Observando los datos, podemos encontrar la regla: el número de múltiplos que no son de ancho se divide por el ancho para determinar el número de fila. Según el número de filas, se puede determinar si la fila es creciente o decreciente, de modo que a través de la enumeración, el número del número de edificio solicitado está en la columna y el número de múltiplos de ancho. Divida el ancho y reste 1 para obtener el número de línea correcto.

Código AC:

#include<stdio.h>
#include<math.h>

int w,m,n;

int main()
{
    
    
    scanf("%d%d%d",&w,&m,&n);
    int x1,y1=0;
    (m%w)?(x1=m/w):(x1=m/w-1);
    if(x1%2==0){
    
    
        for(int i=1+w*x1;i<=w+w*x1;++i)
        {
    
    
            ++y1;
            if(i==m) break;
        }
    }
    else {
    
    
        for(int i=w+w*x1;i>=1+w*x1;--i)
        {
    
    
            ++y1;
            if(i==m) break;
        }
    }
    int x2,y2=0;
    (n%w)?(x2=n/w):(x2=n/w-1);
    if(x2%2==0){
    
    
        for(int i=1+w*x2;i<=w+w*x2;++i)
        {
    
    
            ++y2;
            if(i==n) break;
        }
    }
    else {
    
    
        for(int i=w+w*x2;i>=1+w*x2;--i)
        {
    
    
            ++y2;
            if(i==n) break;
        }
    }
    x1-=x2;
    y1-=y2;
    if(x1<0) x1=-x1;
    if(y1<0) y1=-y1;
    printf("%d",x1+y1);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44643644/article/details/108891178
Recomendado
Clasificación