Time Limit:1000MS | Memory Limit:32768KB | 64bit IO Format:%I64d & %I64u |
Description
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.
解析:
简单的BFS ,Knight移动有八个方向。
在国际象棋中Knight称“马”或“骑士”,Knight的走法和中国象棋中马相同,同样是走“日”字,
或英文字母大写的“L”形:即先向左(或右)走1格,再向上(或下)走2格;或先向左(或右)
走2格,再向上(或下)走1格。不同的是,囯际象棋的Knight没有“绊马脚”的限制,故Knight可越过其他棋子。
吃子与走法相同。
a letter (a-h) representing the column and a digit (1-8) representing the row on the chessboard.
列(a - h),行(1 - 8)
#include <stdio.h> #include <queue> #include <string.h> using namespace std; const int N = 8; const int dr[]={-2,-2,-1,-1, 1, 1, 2,2}; const int dc[]={-1, 1,-2, 2,-2, 2,-1,1}; int vis[N + 1][N + 1]; struct Node{ int r; int c; int lev; }; Node start,end; int dfs(Node s) { if(s.c == end.c && s.r == end.r) return 0; queue<Node> q; q.push(s); Node tmp,front; while( !q.empty()) { front = q.front(); q.pop(); for(int i = 0; i < 8; i++) { //搜索8个方向 tmp.r = front.r + dr[i]; tmp.c = front.c + dc[i]; tmp.lev = front.lev + 1; if(tmp.r == end.r && tmp.c == end.c) { //如果到达终点返回长度 return tmp.lev; } if(tmp.r >= 1 && tmp.r <= N && tmp.c >= 1 && tmp.c <= N) { //不出界 if( !vis[tmp.r][tmp.c]) { vis[tmp.r][tmp.c] = 1; q.push(tmp); } } } } } int main() { char str1[3],str2[3]; int cnt; while(scanf("%s%s",str1,str2) != EOF) { memset(vis,0,sizeof(vis)); start.c = str1[0] - 'a' + 1; start.r = str1[1] - '0'; start.lev = 0; end.c = str2[0] - 'a' + 1; end.r = str2[1] - '0'; cnt = dfs(start); printf("To get from %c%c to %c%c takes %d knight moves.\n",str1[0],str1[1],str2[0],str2[1],cnt); } return 0; }