CSU1459:Chess

Description

CSU1459:Chess_第1张图片

Input

Output

CSU1459:Chess_第2张图片

Sample Input

3
E 2 E 3
F 1 E 8
A 3 A 3

Sample Output

Impossible
2 F 1 B 5 E 8
0 A 3

HINT

Source

GCPC 2013



题意:给出两个点,教皇如果能走到则输出走法,否则输出Impossible

思路:分类讨论,我们可以得出,只有0,1,2三种情况

0,1,不难推出

而2的话,证明两个点不在同一斜线上

那么有两个方程

x+y = a

y-x = b

可以得到两直线相交的点

x = (a+b)/2

y = (a-b)/2


#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

char str[4][2];
int a[4],c[4];

int main()
{
    int n,i;
    scanf("%d",&n);
    while(n--)
    {
        for(i = 0; i<4; i++)
            scanf("%s",str[i]);
        c[0] = str[0][0]-'A';
        c[1] = str[1][0]-'1';
        c[2] = str[2][0]-'A';
        c[3] = str[3][0]-'1';
        a[0] = c[0]+c[1];
        a[1] = c[0]-c[1];
        a[2] = c[2]+c[3];
        a[3] = c[2]-c[3];
        if((a[0]) % 2 != (a[2]) % 2)
            printf("Impossible\n");
        else if(c[0] == c[2] && c[1] == c[3])
            printf("0 %c %c\n", c[0] + 'A', c[1] + '1');
        else if(a[0] == a[2] || a[1] == a[3])
            printf("1 %c %c %c %c\n", c[0] + 'A', c[1] + '1', c[2] + 'A', c[3] + '1');
        else if(a[0] + a[3] >= 0 && a[0] + a[3] < 16 && a[0] - a[3] >= 0 && a[0] - a[3] < 16)
            printf("2 %c %c %c %c %c %c\n", c[0] + 'A', c[1] + '1', (a[0] + a[3])/2 + 'A', (a[0] - a[3])/2 + '1', c[2] + 'A', c[3] + '1');
        else
            printf("2 %c %c %c %c %c %c\n", c[0] + 'A', c[1] + '1', (a[1] + a[2])/2 + 'A', (a[2] - a[1])/2 + '1', c[2] + 'A', c[3] + '1');
    }

    return 0;
}


你可能感兴趣的:(水,CSU)