Run Time: 0.010
Ranking (as of 2016-09-13): 12 out of 392
Language: C++
/*
UVa 707 - Robbery
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_707_Robbery.cpp
*/
#include <cstdio>
const int W_max = 100, H_max = 100, t_max = 100;
int W, H, t, city[t_max + 1][H_max + 1][W_max + 1];
struct deduction {
int r_, c_;
} deductions[t_max + 1];
const int nr_moves = 5;
const int moves[nr_moves][2] = {{0, 0}, {0, -1}, {0, 1}, {-1, 0}, {1, 0}};
void deduce(int ti, int r, int c)
{
#ifdef DEBUG
printf("%d %d %d\n", ti, r, c);
#endif
if (deductions[ti].r_ == -1)
deductions[ti].r_ = r, deductions[ti].c_ = c;
else if (r != deductions[ti].r_ || c != deductions[ti].c_)
deductions[ti].c_ = -1;
}
int move(int ti, int r, int c)
{
int& result = city[ti][r][c];
if (result != -1)
return result;
if (ti == t) {
result = 1;
deduce(ti, r, c);
}
else {
result = 0;
for (int i = 0; i < nr_moves; i++) {
int nr = r + moves[i][0], nc = c + moves[i][1];
if (nr > 0 && nr <= H && nc > 0 && nc <= W && move(ti + 1, nr, nc)) {
result = 1;
deduce(ti, r, c);
}
}
}
return result;
}
int main()
{
for (int nr = 1; ; nr++) {
scanf("%d %d %d", &W, &H, &t);
if (!W)
break;
for (int i = 1; i <= t; i++) {
for (int j = 1; j <= H; j++)
for (int k = 1; k <= W; k++)
city[i][j][k] = -1;
deductions[i].r_ = deductions[i].c_ = -1;
}
int n;
scanf("%d", &n);
while (n--) {
int ti, Li, Ti, Ri, Bi;
scanf("%d %d %d %d %d", &ti, &Li, &Ti, &Ri, &Bi);
for (int i = Ti; i <= Bi; i++)
for (int j = Li; j <= Ri; j++)
city[ti][i][j] = 0;
}
for (int i = 1; i <= H; i++)
for (int j = 1; j <= W; j++)
move(1, i, j);
printf("Robbery #%d:\n", nr);
if (deductions[t].r_ == -1)
puts("The robber has escaped.\n");
else {
int nr_deductions = 0;
for (int i = 1; i <= t; i++)
if (deductions[i].c_ != -1) {
nr_deductions++;
printf("Time step %d: The robber has been at %d,%d.\n",
i, deductions[i].c_, deductions[i].r_);
}
if (nr_deductions)
putchar('\n');
else
puts("Nothing known.\n");
}
}
return 0;
}
No comments:
Post a Comment