| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 22204 | Accepted: 10374 |
Description

Input
Output
Sample Input
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
Sample Output
5 28 0
Source
题目描述:
在一个n*n 的棋盘上,给一个骑士的起点和一个终点,并给出骑士8种移动方式,求骑士从起点到终点的最小步数.
简单bfs.
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define N 100010
#define Mod 10000007
#define lson l,mid,idx<<1
#define rson mid+1,r,idx<<1|1
#define lc idx<<1
#define rc idx<<1|1
const double EPS = 1e-11;
const double PI = acos ( -1.0 );
typedef long long ll;
const int INF = 1000010;
using namespace std;
int n, x, y, s, e;
bool vis[310][310];
int xx[8] = {2, 1, -1, -2, -2, -1, 1, 2}, yy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
struct moves
{
int x, y;
int mos;
} ss;
queue<moves>mp;
int bfs()
{
memset ( vis, false, sizeof ( vis ) );
while ( mp.size() )
{
mp.pop();
}
mp.push ( ss );
vis[x][y] = true;
int ans;
moves t, tt;
while ( mp.size() )
{
tt = mp.front();
mp.pop();
if ( tt.x == s && tt.y == e )
break;
for ( int i = 0; i < 8; i++ )
{
if ( tt.x + xx[i] >= 0 && tt.x + xx[i] < n && tt.y + yy[i] >= 0 && tt.y + yy[i] < n && !vis[tt.x + xx[i]][tt.y + yy[i]] )
{
t.x = tt.x + xx[i], t.y = tt.y + yy[i], t.mos = tt.mos + 1;
mp.push ( t );
vis[tt.x + xx[i]][tt.y + yy[i]] = true;
}
}
}
return tt.mos;
}
int main()
{
int t;
while ( cin >> t )
{
while ( t-- )
{
cin >> n >> x >> y >> s >> e;
ss.x = x;
ss.y = y;
ss.mos = 0;
cout << bfs() << endl;
}
}
return 0;
}
原文:http://blog.csdn.net/acm_baihuzi/article/details/41482483