Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 13192 | Accepted: 7395 |
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代码:
#include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; struct point { int x,y; }; //int sx,sy,ex,ey;//s->start y->end point s,e; int step[10][10]; string map[10]; int dx[8] = {1,1,-1,-1,2,2,-2,-2}; int dy[8] = {2,-2,2,-2,1,-1,1,-1}; int BFS(point s) { queue<point>P; //memset(step,0,sizeof(step)); int i; P.push( s ); point hd; step[s.x][s.y] = 0; while(!P.empty()) { hd = P.front(); P.pop(); if(hd.x==e.x && hd.y==e.y) return step[hd.x][hd.y]; for(i=0;i<8;i++) { int x = hd.x + dx[i]; int y = hd.y + dy[i]; if(x>=1 && x<=8 && y>=1 && y<=8 && map[x][y]!='@') { step[x][y] = step[hd.x][hd.y] + 1; map[x][y] = '@'; point t; t.x = x; t.y = y; P.push(t); } } } } int main() { //freopen("test.txt","r",stdin); char s1[5],s2[5]; int i; while(cin>>s1>>s2)//~scanf("%s %s",s1,s2) { s.x = s1[1] - '0'; s.y = s1[0] - 'a' + 1; e.x = s2[1] - '0'; e.y = s2[0] - 'a' + 1; for(i=1;i<=8;i++) map[i] = "........."; printf("To get from %s to %s takes %d knight moves.\n",s1,s2,BFS( s )); } //cout << "Hello world!" << endl; return 0; }