您的位置:首页 > 其它

北大 poj 2243 Knight moves

2011-04-20 12:41 225 查看
这是我第一次做广搜的题,呃,错了无数次,原因有二:一是因为对广搜的形式理解不好,不知道怎么去记忆路径,第二是忘了原来骑士走的是“日”字形……也就是先向某个方向走2步,再向左或右走一步。所以一共有八个方向……

/* THE ROGRAM IS MADE BY PYY */
/*----------------------------------------------------------------------------//
URL   : http://poj.org/problem?id=2243 Name  : Knight Moves
Date  : Tuesday, April 20, 2010
Time Stage : 0:14
Result:
Test Data:
//----------------------------------------------------------------------------*/
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <queue>
using namespace std;
struct node
{
int x, y;
};
const int directions[8][2] = { {2, 1}, {1, 2}, {2, -1}, {-1, 2},
{1, -2}, {-2, 1}, {-1, -2}, {-2, -1} };
char a, b;
int x, y, x2, y2;
int minTrip, tmpTrip;
int mark[10][10];
void out( )
{
int i, j;
for( i = 1; i <= 8; i++ )
{
for( j = 1; j <= 8; j++ )
cout << mark[i][j] << "  ";
cout << endl;
}
}
void bfs()
{
memset( mark, 0, sizeof( mark ) );
mark[x][y] = 1;
if( x == x2 && y == y2 )
return ;
int i, j, k;
minTrip = 0x0f0f0f0f;
tmpTrip = 0;
node n;
queue<node> q;
n.x = x;
n.y = y;
q.push( n );
while( !q.empty() )
{
n = q.front();
q.pop();
for( i = 0; i < 8; i++ )
{
node nt;
nt.x = n.x + directions[i][0];
nt.y = n.y + directions[i][1];
if( nt.x <= 0 || nt.y <= 0 || nt.x > 8 || nt.y > 8 )
continue; // border
if( !mark[nt.x][nt.y] )
{
mark[nt.x][nt.y] = mark[n.x][n.y] + 1;
q.push( nt );
}
if( nt.x == x2 && nt.y == y2 ) // final point
{
return ;
}
}
}
}
int main()
{
int i, j, k, tcase;
while( cin >> a >> y >> b >> y2 )
{
x = a - 'a' + 1;
x2 = b - 'a' + 1;
bfs();
printf("To get from %c%d to %c%d takes %d knight moves./n", a, y, b, y2, mark[x2][y2]-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: