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;
}