Knight Moves
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 56 Accepted Submission(s) : 41
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
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.
Input
Output
Sample Input
e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
Sample Output
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<iostream> #include<algorithm> #include<string.h> #include<cstdio> #include<queue> int d[8][2] = { {2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2} }; bool b[9][9]; using namespace std; struct node { int x, y,step; }; int main() { char a1[2], a2[2]; while (cin>>a1>>a2) { memset(b, 0, sizeof(b)); int x1, y1, x2, y2; x1 = a1[0] - 'a' + 1; y1 = a1[1] - '0'; x2 = a2[0] - 'a' + 1; y2 = a2[1] -'0'; queue<node> P; node dc; dc.x = x1, dc.y = y1,dc.step=0; P.push(dc); b[x1][y1] = 1; while (!P.empty()) { node de = P.front(); P.pop(); if (de.x == x2&&de.y == y2) { printf("To get from %s to %s takes %d knight moves.\n", a1, a2, de.step); break; } for (int i = 0; i < 8; i++) { int xx = de.x + d[i][0], yy = de.y + d[i][1], step2 = de.step + 1; if (xx >= 1 && xx <= 8 && yy >= 1 && yy <= 8&&b[xx][yy]==0) { b[xx][yy] = 1; dc.x = xx, dc.y = yy, dc.step = step2; P.push(dc); } } } while (!P.empty()) P.pop(); } return 0; }