BFS
题意:给你棋盘上两点的坐标,按照中国象棋中马的走法,求出其最短的步数。
// File Name: 1073.cpp
// Author: bo_jwolf
// Created Time: 2014年02月03日 星期一 21时24分46秒
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
using namespace std;
int dir[ 15 ][ 5 ] = { { -2, 1 }, { -1, 2 }, { -2, -1 }, { -1, -2 },{ 2, 1 },{ 1, 2 }, { 2, -1 }, { 1, -2 } };
const int maxn = 1005;
int vis[ maxn ][ maxn ], sx, sy, ex, ey, Step = 0;
struct node{
int x, y, step;
}edge[ maxn ];
void Bfs(){
queue< node > Q;
node temp, p, q;
temp.x = sx;
temp.y = sy;
vis[ sx ][ sy ] = 1;
temp.step = 0;
Q.push( temp );
if( sx == ex && sy == ey ){
Step = 0;
return;
}
while( !Q.empty() ){
p = Q.front();
Q.pop();
for( int i = 0; i < 8; ++i ){
int y = p.y + dir[ i ][ 0 ];
int x = p.x + dir[ i ][ 1 ];
if( x >= 0 && y >= 0 && x < 8 && y < 8 && !vis[ x ][ y ] ){
q.x = x;
q.y = y;
q.step = p.step + 1;
if( x == ex && y == ey ){
Step = q.step;
return;
}
vis[ x ][ y ] = 1;
Q.push( q );
}
}
}
}
int main(){
char str1[ maxn ], str2[ maxn ];
while( scanf( "%s %s", str1, str2 ) == 2 ){
sx = str1[ 0 ] - 'a';
sy = str1[ 1 ] - '1';
ex = str2[ 0 ] - 'a';
ey = str2[ 1 ] - '1';
memset( vis, 0, sizeof( vis ) );
Bfs();
printf( "To get from %s to %s takes %d knight moves.\n", str1, str2, Step );
}
return 0;
}