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