ZCMU-1345: Ajedrez

Hay una trampa en esta pregunta, es decir, nunca he jugado al ajedrez, pensando que solo puedo caminar en línea recta con una pendiente de más o menos 1 una vez cuando camino en diagonal. . .

tema

ZCMU-1345
1345: Ajedrez
Límite de tiempo: 1 segundo Límite de memoria: 128 MB
Enviar: 224 Resuelto: 75
[Enviar] [Estado] [Tablero web]
Descripción
El tablero de ajedrez es un cuadrado blanco y negro de 8 * 8, piezas de ajedrez Ponlo en el medio de la cuadrícula.
Las reglas para caminar con el rey, la reina, el carro y el elefante son las siguientes:
Wang: Puedes caminar horizontal, recto y diagonalmente, pero cada paso está limitado a un cuadrado.
Atrás: Puede caminar horizontal, vertical y diagonalmente, y el número de pasos por paso es ilimitado.
Coche: puedes caminar tanto horizontal como verticalmente, no en diagonal, y no hay límite para el número de cuadrículas.
Alfil: Solo puede ir en diagonal y no hay límite para el número de cuadrículas.
Su tarea es escribir un programa, dada una posición inicial y una posición objetivo, calcular el número mínimo de pasos necesarios para que el rey, la retaguardia, el automóvil y el elefante caminen desde la posición inicial hasta la posición objetivo.

La
primera línea de Entrada es el número de grupos de datos de prueba t (0 <= t <= 20). Cada una de las siguientes filas es un conjunto de datos de prueba, cada grupo incluye dos posiciones en el tablero de ajedrez, la primera es la posición inicial y la segunda es la posición objetivo. La posición se expresa en forma de "letra-número", con letras de "a" a "h" y números de "1" a "8".

Salida
Para cada conjunto de datos de prueba de entrada, genere el número mínimo de pasos necesarios para el rey, la reina, el coche y el elefante. Si no se puede alcanzar, emita "Inf".

Entrada de muestra
2
a1 c3
f5 f8
Salida de muestra
2 1 2 1
3 1 1 Inf
SUGERENCIA
Utilice% s para leer la cadena


idea

Esta pregunta es en realidad una simple simulación, pero todavía hay algunos puntos a tener en cuenta:
primero, clasificamos las posiciones relativas del punto de inicio y el punto final. Dividido en tres categorías:
1. El punto de inicio y el punto final son iguales o están en la misma columna
. 2. El punto de inicio y el punto final están en una línea recta con una pendiente absoluta de 1.
3. Otras situaciones

Inserte la descripción de la imagen aquí

Preste especial atención a las tres situaciones de caminar en diagonal, una no está caminando, la otra está caminando y la otra está caminando dos pasos.
Primero, si puede ir en diagonal, entonces el punto de partida y el punto final deben ser del mismo color. (el tablero superior Medio), es decir, la suma de las coordenadas horizontal y vertical del punto de inicio y la suma de las coordenadas horizontal y vertical del punto final deben ser iguales, de modo que se juzgue si está en una línea recta con una pendiente absoluta de 1, si lo es, es un paso, de lo contrario son dos pasos Ven a

En otros casos, es simple, ¡vayamos directamente al código!


Código AC

#include<bits/stdc++.h>
using namespace std;
#define gcd __gcd;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define pre(i,a,b) for(int i=a;i>=b;--i)
#define m(x) memset(x,0,sizeof x);
int dis_a,dis_b,dis_c,dis_d;
int main(){
    
    
    int T;
    int flag1,flag2;
    int Xs,Ys,Xe,Ye;
    char input1[5],input2[5];
    scanf("%d",&T);
    while(T--)
    {
    
    
        //flag1标记起始和终点是否在同一行或者同一列
        //flag2标记是否在斜率为1的直线上
        flag1 = flag2 = 0;
        scanf("%s%s",input1,input2);
        Xs = input1[0] - 'a' + 1;Ys = input1[1] - '0';
        Xe = input2[0] - 'a' + 1;Ye = input2[1] - '0';
//        cout << Xs << " " << Ys << endl;
//        cout << Xe << " " << Ye << endl;
        if(Xs==Xe&&Ys==Ye){
    
    
            printf("0 0 0 0\n");
            continue;
        }
        if(Xs==Xe||Ys==Ye)flag1 = 1;
        if(fabs(Ys-Ye)==fabs(Xs-Xe))flag2 = 1;
        if(flag1){
    
    
            dis_a = fabs(Xs-Xe) + fabs(Ys-Ye);
            dis_b = 1;
            dis_c = 1;
            if((Xs+Ys)+(Xe+Ye)&1)//检查起点和终点是否在同色棋盘上
            printf("%d %d %d %s\n",dis_a,dis_b,dis_c,"Inf");
            else
            printf("%d %d %d %d\n",dis_a,dis_b,dis_c,2);
            continue;
        }
        if(flag2){
    
    
            dis_a = fabs(Xs-Xe);
            dis_b = dis_d = 1;
            dis_c = 2;
            printf("%d %d %d %d\n",dis_a,dis_b,dis_c,dis_d);
            continue;
        }
        dis_a = max(fabs(Xs-Xe),fabs(Ys-Ye));
        dis_b = 2;
        dis_c = 2;
        if((Xs+Ys)+(Xe+Ye)&1)
        printf("%d %d %d %s\n",dis_a,dis_b,dis_c,"Inf");
        else
        printf("%d %d %d %d\n",dis_a,dis_b,dis_c,2);
    }
    
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/DAVID3A/article/details/115256688
Recomendado
Clasificación