2013GCPC C题 Chess(BFS+路径打印)

https://www.jisuanke.com/contest/1546/100748
基础的BFS和路径输出,方向开多一点就好了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100050;
struct point{
    int x,y;
    int pre;
    int step;
};
bool operator<(point a,point b){
    return a.step>b.step;
}
int dir[32][2]={{1,1},{2,2},{3,3},{4,4},{5,5},{6,6},{7,7},{8,8},
                {1,-1},{2,-2},{3,-3},{4,-4},{5,-5},{6,-6},{7,-7},{8,-8},
                {-1,1},{-2,2},{-3,3},{-4,4},{-5,5},{-6,6},{-7,7},{-8,8},
                {-1,-1},{-2,-2},{-3,-3},{-4,-4},{-5,-5},{-6,-6},{-7,-7},{-8,-8},
};
bool vis[10][10];
bool check(int x,int y){
    return x>=1&&x<=8&&y>=1&&y<=8;
}
point pre[10][10];
int bfs(int sx,int sy,int ex,int ey){
    memset(vis,0,sizeof(vis));
    priority_queue<point> q;
    point nt;
    nt.x=sx;
    nt.y=sy;
    nt.step=0;
    vis[sx][sy]=1;
    q.push(nt);
    while(!q.empty()){
        point rt=q.top();
        q.pop();
        if(rt.x==ex&&rt.y==ey){
            return rt.step;
        }
        for(int i=0;i<32;i++){
            int dx=rt.x+dir[i][0];
            int dy=rt.y+dir[i][1];
            if(!vis[dx][dy]&&check(dx,dy)){
                vis[dx][dy]=1;
                nt.x=dx;
                nt.y=dy;
                pre[nt.x][nt.y].x=rt.x;
                pre[nt.x][nt.y].y=rt.y;
                nt.step=rt.step+1;
                q.push(nt);
            }
        }
    }
    return -1;
}
void dfs(int x,int y){
    if(x==0&&y==0){
        return ;
    }
    dfs(pre[x][y].x,pre[x][y].y);
    printf(" %c %d",y+'A'-1,9-x);
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        memset(pre,0,sizeof(pre));
        char a,c;
        int b,d;
        cin>>a>>b>>c>>d;
        int sy=a-'A'+1;
        int sx=8-b+1;
        int ey=c-'A'+1;
        int ex=8-d+1;
//        cout<<sx<<" "<<sy<<" "<<ex<<" "<<ey<<endl;
        int ans=bfs(sx,sy,ex,ey);
        if(ans==-1) puts("Impossible");
        else {
            printf("%d",ans);
            dfs(ex,ey);
            puts("");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值