1087 - Dama

Um problema que envolve um raciocínio bem legal.

Descrição

Solução

Primeiramente, vamos provar que é possível ir de uma casa até qualquer outra casa do tabuleiro com no máximo dois movimentos. Considere a origem com as coordenadas (x1, y1) e o destino com as coordenadas (x2, y2). Os dois movimentos no máximo que você pode fazer com a rainha consistem em primeiro ir para (x2, y1) e depois ir para (x2, y2).

A partir daí, podemos economizar uma viagem se pudermos ir direto para (x2, y2) usando os movimentos possíveis da rainha, o que pode acontecer em três casos diferentes:

  • Os pontos de origem e destino estão na mesma linha, ou seja, x1 = x2;

  • Os pontos de origem e destino estão na mesma coluna, ou seja, y1 = y2;

  • Os pontos de origem e destino estão na mesma diagonal, ou seja, |x1 - x2| = |y1 - y2| (a diferença entre as distâncias horizontal e vertical são iguais).

Lembrando que quando x1 = x2 e y1 = y2, não é necessário fazer movimento algum.

#include <stdlib.h>
#include <stdio.h>

int main(){
    int X1, Y1, X2, Y2;

    while(scanf("%d %d %d %d", &X1, &Y1, &X2, &Y2)){
        if(!X1 && !Y1 && !X2 && !Y2)    break;

        if(X1 == X2 && Y1 == Y2){
            printf("0\n");
        }else if(X1 == X2 || Y1 == Y2 || abs(X1 - X2) == abs(Y1 - Y2)){
            printf("1\n");
        }else{
            printf("2\n");
        }
    }

    return 0;
}

Last updated