[ZOJ1144][POJ1104] Robbery

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;
}


發佈了43 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章