csu 1459: Chess (橡棋)

来源:互联网 发布:阿里云ecs搭建php网站 编辑:程序博客网 时间:2024/06/03 18:25

1459: Chess

Time Limit: 1 Sec Memory Limit: 128 MB Special Judge
Submit: 58 Solved: 31
[Submit][Status][Web Board]

Description

Input

Output

Sample Input

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

Sample Output

Impossible2 F 1 B 5 E 80 A 3
给出起点和终点,棋盘有两种颜色黑和白,跳的归则是只能跳到相同的颜色格子,问能跳到终到吗,能则输出跳的路径。
#include<stdio.h>#include<queue>#include<iostream>using namespace std;typedef struct nnn{    int x,y,step;}NODE;int path[100],color;NODE node[2];int bfs(){    path[node[0].y*8+node[0].x]=node[0].y*8+node[0].x;    if(node[0].x==node[1].x&&node[0].y==node[1].y)        return 1;    queue<NODE>q;    NODE p,pre;    int vist[10][10]={0};    int dir[4][2]={1,-1,-1,1,1,1,-1,-1};    node[0].step=0;    vist[node[0].y][node[0].x]=1;    q.push(node[0]);    while(!q.empty())    {        pre=q.front(); q.pop();        for(int e=0; e<4; e++)        {            p=pre; p.step++;            for(int i=1; i<8; i++)            {                p.y=p.y+dir[e][0]*i;                p.x=p.x+dir[e][1]*i;                if(p.y>=0&&p.y<8&&p.x>=0&&p.x<8&&vist[p.y][p.x]==0)                if(color==(p.y+p.x)%2)                {                    path[p.y*8+p.x]=pre.y*8+pre.x;                    if(p.y==node[1].y&&p.x==node[1].x)                        return 1;                    vist[p.y][p.x]=1;                    if(p.step<3)q.push(p);                }                p.y=p.y-dir[e][0]*i;                p.x=p.x-dir[e][1]*i;            }            p.step--;        }    }    return 0;}int main(){    int t,b,pp[100];    char s[2];    scanf("%d",&t);    while(t--)    {        scanf("%s %d",s,&b);node[0].x=s[0]-'A';node[0].y=8-b;        scanf("%s %d",s,&b);node[1].x=s[0]-'A';node[1].y=8-b;        color=(node[0].y+node[0].x)%2;        if(color!=(node[1].y+node[1].x)%2)        printf("Impossible\n");        else        {            int flog=bfs();            if(flog==0)            printf("Impossible\n");            else            {                int k=0,y;                int x=node[1].y*8+node[1].x;                while(path[x]!=x)                {                    pp[k++]=x; x=path[x];                }                pp[k++]=x;                printf("%d",k-1);                for(int i=k-1;i>=0; i--)                {                    y=pp[i]/8; x=pp[i]%8;                    printf(" %c %d",x+'A',8-y);                }                printf("\n");            }        }    }}


0 0