Accepted date: 2017-03-24
Run Time: 0.050
Ranking (as of 2017-03-24): 74 out of 369
Language: C++
/*
UVa 298 - Race Tracks
To build using Visual Studio 2015:
cl -EHsc -O2 UVa_298_Race_Tracks.cpp
*/
#include <queue>
#include <limits>
#include <cstdio>
using namespace std;
const int infinite = numeric_limits<int>::max();
const int X_max = 30, Y_max = 30, v_min = -3, v_max = 3, vc_min = -1, vc_max = 1;
const int nr_vs = v_max - v_min + 1;
int nr_hops[X_max][Y_max][nr_vs][nr_vs];
// nr_hops[x][y][vx - v_min][vy - v_min] is the number of hops at (x, y)
// with the velocity of (vx, vy)
bool obstacles[X_max][Y_max]; // obstacles[x][y] is true if there is an obstacle at (x, y)
struct path {
int x_, y_, vx_, vy_, nr_;
path(int x, int y, int vx, int vy, int nr) : x_(x), y_(y), vx_(vx), vy_(vy), nr_(nr) {}
};
int main()
{
int N;
scanf("%d", &N);
while (N--) {
int X, Y;
scanf("%d %d", &X, &Y);
for (int i = 0; i < X; i++)
for (int j = 0; j < Y; j++) {
obstacles[i][j] = false;
for (int vi = 0; vi < nr_vs; vi++)
for (int vj = 0; vj < nr_vs; vj++)
nr_hops[i][j][vi][vj] = infinite;
}
int sx, sy, fx, fy;
scanf("%d %d %d %d", &sx, &sy, &fx, &fy);
int P;
scanf("%d", &P);
while (P--) {
int x1, x2, y1, y2;
scanf("%d %d %d %d", &x1, &x2, &y1, &y2);
for (int i = x1; i <= x2; i++)
for (int j = y1; j <= y2; j++)
obstacles[i][j] = true;
}
queue<path> q;
nr_hops[sx][sy][-v_min][-v_min] = 0;
q.push(path(sx, sy, -v_min, -v_min, 0));
while (!q.empty()) {
path p = q.front();
q.pop();
#ifdef DEBUG
printf("(%d, %d) with v(%d, %d): %d\n",
p.x_, p.y_, p.vx_ + v_min, p.vy_ + v_min, p.nr_);
#endif
int nr = p.nr_ + 1;
for (int vcx = vc_min; vcx <= vc_max; vcx++) {
int vx = p.vx_ + v_min + vcx;
if (vx < v_min || vx > v_max)
continue;
int x = p.x_ + vx;
if (x < 0 || x >= X)
continue;
for (int vcy = vc_min; vcy <= vc_max; vcy++) {
int vy = p.vy_ + v_min + vcy;
if (vy < v_min || vy > v_max)
continue;
int y = p.y_ + vy;
if (y < 0 || y >= Y || obstacles[x][y])
continue;
if (nr_hops[x][y][vx - v_min][vy - v_min] <= nr)
continue;
#ifdef DEBUG
printf(" (%d, %d) with v(%d, %d): %d\n",
x, y, vx + v_min, vy + v_min, nr);
#endif
nr_hops[x][y][vx - v_min][vy - v_min] = nr;
q.push(path(x, y, vx - v_min, vy - v_min, nr));
}
}
}
int nr = infinite;
for (int vi = 0; vi < nr_vs; vi++)
for (int vj = 0; vj < nr_vs; vj++)
if (nr_hops[fx][fy][vi][vj] < nr)
nr = nr_hops[fx][fy][vi][vj];
if (nr < infinite)
printf("Optimal solution takes %d hops.\n", nr);
else
puts("No solution.");
}
return 0;
}