一个可以走8个方向。BFS求最短路
代码:
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int v[10][10];
int stx,sty,enx,eny;
struct node{
int x,y;
int step;
};
node ans;
node t;
int dx[] = {-1,-2,-2,-1,1,2,2,1};
int dy[] = {-2,-1,1,2,2,1,-1,-2};
void bfs()
{
memset(v,0,sizeof(v));
queue<node> q;
node f;
f.x = stx;
f.y = sty;
f.step = 0;
q.push(f);
while(!q.empty())
{
node h = q.front();
q.pop();
if(h.x == enx && h.y == eny)
{
ans = h;
return ;
}
for(int i = 0 ;i < 8;++i)
{
int tx = h.x + dx[i];
int ty = h.y + dy[i];
if(tx >= 1 && tx <= 8 && ty >= 1 && ty <= 8 && !v[tx][ty])
{
t.x = tx;
t.y = ty;
t.step = h.step + 1;
q.push(t);
v[tx][ty] = 1;
}
}
}
}
int main()
{
char s[5],s1[5];
while(~scanf("%s%s",s,s1))
{
stx = s[1] - '0';
sty = s[0] - 'a' + 1;
enx = s1[1] -'0';
eny = s1[0] - 'a' + 1;
if(stx == enx && sty == eny)
{
printf("To get from %s to %s takes 0 knight moves.\n",s,s1);
continue;
}
bfs();
printf("To get from %s to %s takes %d knight moves.\n",s,s1,ans.step);
}
return 0;
}