Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 22220 | Accepted: 10384 |
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
TUD Programming Contest 2001, Darmstadt, Germany
bfs用sdl的list写,效率堪忧。换成queue。
麻烦的是queue没有clear,只能一个一个pop,或者新开一个queue。
#include <cstdio> #include <cstdlib> #include <queue> #include <cstring> using namespace std; #define MAXN 303 int size = 0; bool visit[MAXN][MAXN] = {0}; int mx[8] = {-2, -1, 1, 2, 2, 1, -1, -2}; int my[8] = {1, 2, 2, 1, -1, -2, -2, -1}; int step_num = 0; struct point { int x; int y; int n; }; queue <point> myq; point sp; point dp; void init() { memset (visit, 0, sizeof(visit)); while(!myq.empty()) { myq.pop(); } return; } bool bfs(point p) { int x = p.x; int y = p.y; int n = p.n; if (x < 0 || x >= size || y < 0 || y >= size) return false; if (visit[x][y]) return false; visit[x][y] = true; if (x == dp.x && y == dp.y){ step_num = n; return true; } for (int i = 0; i < 8; ++i) { point newp; newp.x = x + mx[i]; newp.y = y + my[i]; newp.n = n + 1; myq.push(newp); //printf("%d %d %d\n", newp.x, newp.y, newp.n); } return false; } int main() { int n = 0; scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", &size); scanf("%d%d%d%d", &sp.x, &sp.y, &dp.x, &dp.y); init(); myq.push(sp); while(!myq.empty()) { if(bfs(myq.front())) break; myq.pop(); } printf("%d\n", step_num); } }