Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13145 | Accepted: 7369 |
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.
Source
Ulm Local 1996
POJ链接:http://poj.org/problem?id=2243
HDU链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372
题意:还是马踏棋盘,和上一篇(http://blog.csdn.net/hurmishine/article/details/50939508)差不多,只不过这题的棋盘有点"特别"而已,简单转换一下就可以了.
AC代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <queue> using namespace std; int step; int to[8][2] = {-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};//骑士移动的8个方位 int map[10][10],ex,ey; char s1[5],s2[5]; struct node { int x,y,step; }; int bfs() { int i; queue<node> Q; node start,next,mid; start.x = s1[0]-'a'; start.y = s1[1]-'1'; start.step = 0; ex = s2[0]-'a';//end ey = s2[1]-'1'; memset(map,0,sizeof(map)); map[start.x][start.y] = 1; Q.push(start); while(!Q.empty()) { mid = Q.front(); Q.pop(); if(mid.x == ex && mid.y == ey) return mid.step; for(i = 0; i<8; i++) { next.x = mid.x+to[i][0]; next.y = mid.y+to[i][1]; if(next.x == ex && next.y == ey) return mid.step+1; if (next.x>=0&&next.x<8&&next.y>=0&&next.y<8&&map[next.x][next.y]==0) { next.step=mid.step+1; map[next.x][next.y]=1; Q.push(next); } } } return 0; } int main() { while(~scanf("%s%s",s1,s2)) { printf("To get from %s to %s takes %d knight moves.\n",s1,s2,bfs()); } return 0; }