题目链接:https://cpc.csgrandeur.cn/csgoj/problemset/problem?pid=1131
具体详见代码
#include<bits/stdc++.h>
using namespace std;
int dist[10][10],vis[30][30];
int dx[]={0,1,1,1,0,-1,-1,-1};//8个方向,只要对应方向坐标对就行,没有什么顺序要求
int dy[]={1,1,0,-1,-1,-1,0,1};
void bfs(int r1,int c1,int r2,int c2,int r3,int c3){
memset(dist,-1,sizeof dist);
memset(vis,0,sizeof vis);
queue<pair<int,int>> q;
q.push({r1,c1});
dist[r1][c1]=0;
vis[r1][c1]=1;
while(q.size()){
auto t=q.front();
q.pop();
for(int i=0;i<8;i++)
{
int xx=t.first+dx[i],yy=t.second+dy[i];
if(xx==r3&&yy==c3) continue;//把这个条件和下面那个条件合并过不了,还是分开放吧
if(xx>=1&&xx<=8&&yy>=1&&yy<=8&&!vis[xx][yy])
{
q.push({xx,yy});
dist[xx][yy]=dist[t.first][t.second]+1;
vis[xx][yy]=1;
}
}
}
}
int main(){
int r1,c1,r2,c2,r3,c3,t=0;
while(scanf("%d%d%d%d%d%d",&r1,&c1,&r2,&c2,&r3,&c3)!=EOF){
t++;
bfs(r1,c1,r2,c2,r3,c3);
printf("Case %d: %d\n",t,dist[r2][c2]);
}
return 0;
}