ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1144
POJ:http://poj.org/problem?id=1104
題目大意:
有大盜光顧了一個W*H的矩形城市。給出一些信息,t時刻大盜不在矩陣L,Top,Left,Right,Bottom裏。
判斷大盜是否逃出去了。如果沒有逃出,輸出可以確定大盜的位置的時刻及該時刻大盜的位置。如果沒有逃出且在任意時刻都不能確定大盜位置,輸出"Nothing know."然後等着主管發飆……
解題思路:
數據範圍不大, W, H, t (1 <= W,H,t <= 100)。於是決定暴力解決。
先根據讀入的ti, Li, Ti, Ri, Bi信息初始化大盜不可能存在的位置not_visit[t][x][y]。之後使用類此floodfill的思路,分別用按t正推和按t逆推將not_visit[t][x][y]填好。
之後對每一時刻t,統計not_visit[t][x][y]==0(即大盜可能存在位置)的數量記爲tmp。若某一個時刻tmp==0則大盜逃出去了,輸出escape。若tmp==1則在這一時刻可以確定大盜的位置。
源代碼:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 110
int W, H, T, n;
bool notv[maxn][maxn][maxn];
bool cant(int t, int x, int y, int tadd)
{
if (x>0 && !notv[t+tadd][x-1][y]) return false;
if (x<W-1 && !notv[t+tadd][x+1][y]) return false;
if (y>0 && !notv[t+tadd][x][y-1]) return false;
if (y<H-1 && !notv[t+tadd][x][y+1]) return false;
if (!notv[t+tadd][x][y]) return false;
return true;
}
int main()
{
int cs=0, t, x1, y1, x2, y2;
int maybe[maxn], xx[maxn], yy[maxn];
bool escape, know;
while (scanf("%d%d%d", &W, &H, &T)==3 && W && H && T)
{
printf("Robbery #%d:\n", ++cs);
scanf("%d", &n);
memset(notv, 0, sizeof(notv));
memset(maybe, 0, sizeof(maybe));
escape=false;
for (int i=0; i<n; i++)
{
scanf("%d%d%d%d%d", &t, &x1, &y1, &x2, &y2);
for (int x=x1-1; x<x2; x++) //根據輸入判斷強盜肯定不在的位置
for (int y=y1-1; y<y2; y++)
notv[t-1][x][y]=true;
}
for (int t=1; t<T; t++) //正着一遍floodfill強盜肯定不在的位置
for (int x=0; x<W; x++)
for (int y=0; y<H; y++)
if (!notv[t][x][y] && cant(t, x, y, -1))
notv[t][x][y]=true;
for (int x=0; x<W; x++)
for (int y=0; y<H; y++)
{
if (!notv[T-1][x][y])
{
maybe[T-1]++; xx[T-1]=x; yy[T-1]=y;
}
}
if (maybe[T-1]==0) escape=true; //判斷最後時刻是否逃走,是的話結束
for (int t=T-2; t>=0 && !escape; t--) //反着一遍floodfill強盜肯定不在的位置
{
for (int x=0; x<W; x++)
for (int y=0; y<H; y++)
{
if (!notv[t][x][y] && cant(t, x, y, +1))
notv[t][x][y]=true;
if (!notv[t][x][y])
{
maybe[t]++; xx[t]=x; yy[t]=y;
}
}
if (maybe[t]==0) escape=true;
}
if (escape)
printf("The robber has escaped.\n\n");
else
{
know=false;
for (int t=0; t<T; t++)
if (maybe[t]==1)
{
know=true;
printf("Time step %d: The robber has been at %d,%d.\n", t+1, xx[t]+1, yy[t]+1);
}
if (!know) printf("Nothing known.\n");
printf("\n");
}
}
return 0;
}