Knight Moves
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3929 Accepted Submission(s): 2448
Of course you know that it is vice versa. So you offer him to write a program that solves the "difficult" part.
Your job is to write a program that takes two squares a and b as input and then determines the number of knight moves on a shortest route from a to b.
e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
To get from e2 to e4 takes 2 knight moves.
To get from a1 to b2 takes 4 knight moves.
To get from b2 to c3 takes 2 knight moves.
To get from a1 to h8 takes 6 knight moves.
To get from a1 to h7 takes 5 knight moves.
To get from h8 to a1 takes 6 knight moves.
To get from b1 to c3 takes 1 knight moves.
To get from f6 to f6 takes 0 knight moves.
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
const int dir[8][2]= {1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1};
const int N = 10;
char ch1, ch2, ch3, ch4;
int x1, y1, x2, y2;
int used[N][N];
void DFS(int x, int y, int t)
{
if(x>7||x<0||y>7||y<0||used[x][y]<=t)
return;
used[x][y]=t;
for (int i = 0; i < 8; i++)
{
int tx=x+dir[i][0];
int ty=y+dir[i][1];
DFS(tx,ty,t+1);
}
}
int main()
{
while (scanf("%c%c %c%c", &ch1, &ch2, &ch3, &ch4) != EOF)
{
getchar();
x1 = ch1 - 'a', y1 = ch2 - '1';
x2 = ch3 - 'a', y2 = ch4 - '1';
for (int i = 0; i < 8; i++)
for (int j = 0; j < 8; j++)
used[i][j] = 64;
DFS(x1, y1, 0);
printf("To get from %c%c to %c%c takes %d knight moves.\n", ch1, ch2, ch3, ch4, used[x2][y2]);
}
}