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.
题意:现有一个8*8棋盘,给你一个起始坐标和终点坐标,问你一个“马”(中国象棋)从起始坐标到终点坐标至少需要走几步。
code:
#include<stdio.h> #include<string.h> #include<queue> using namespace std; #define n 8 #define m 8 int t_x, t_y, vis[10][10]; int d_x[] = {-1,-2,-2,-1,1,2,2,1}; //"马"的步伐,摩擦摩擦,似魔鬼的步伐 int d_y[] = {-2,-1,1,2,-2,-1,1,2}; struct Node { int x, y, step; }node; int bfs(int x, int y) { memset(vis, 0, sizeof(vis)); queue<Node> q; node.x = x, node.y = y, node.step = 0; q.push(node); vis[x][y] = 1; while(!q.empty()) { Node u = q.front(); q.pop(); if(u.x == t_x && u.y == t_y) return u.step; for(int i=0; i<8; i++) { Node next; next.x = u.x+d_x[i], next.y = u.y+d_y[i]; if(vis[next.x][next.y] || next.x < 1 || next.x > n || next.y < 1 || next.y > m) continue; next.step = u.step+1; q.push(next); vis[next.x][next.y] = 1; } } } int main() { char s[5], t[5]; while(~scanf("%s%s", s,t)) { int s_x = s[1]-'0'; int s_y = s[0]-'a'+1; t_x = t[1]-'0'; t_y = t[0]-'a'+1; printf("To get from %s to %s takes %d knight moves.\n", s,t,bfs(s_x,s_y)); } return 0; }