码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 707 - Robbery

时间:2015-03-13 18:51:45      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:uva

搜啊搜~~~~~~~

1.用记忆化搜索 来搜答案,否则搜不完~

2.题目理解起来有困难....sad

讲:如果最后没有找到任何时间任何地点可能有贼,说明他跑掉了

       除了上面这种情况,如果在所有时间里都同时存在多于一个点可能有贼,则Nothing known

除了上面两种情况,输出能确定贼的时间和该时间贼的地点

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

typedef pair<int,int> pii;
const int maxn = 105;

int h,w,t;
int d[maxn][maxn][maxn];
int dx[] = {-1,0,1,0,0};
int dy[] = {0,1,0,-1,0};
vector<pii> ans[maxn];

void init(){
    memset(d,-1,sizeof(d));
    int n;
    scanf("%d",&n);
    int tt,xa,ya,xb,yb;
    for(int i = 0; i < n; i++){
        scanf("%d%d%d%d%d",&tt,&xa,&ya,&xb,&yb);
        for(int i = xa; i <= xb; i++){
            for(int j = ya; j <= yb; j++){
                d[tt][i][j] = 0;
            }
        }
    }
}
int dfs(int x,int y,int tt){
    int &ans = d[tt][x][y];
    if(ans != -1) return ans;
    ans = 0;
    if(tt == t) return ans = 1;
    for(int i = 0; i < 5; i++){
        int xx = x + dx[i];
        int yy = y + dy[i];
        if(xx<1||xx>h||yy<1||yy>w) continue;
        if(dfs(xx,yy,tt+1)) ans = 1;
    }
    return ans;
}
int solve(){
    int flag;
    for(int i = 1; i <= t; i++){
        flag = 0;
        ans[i].clear();
        for(int j = 1; j <= h; j++){
            for(int k = 1; k <= w; k++){
                if(d[i][j][k] == 1){
                    ans[i].push_back(make_pair(j,k));
                    flag = 1;
                }
            }
        }
        if(flag == 0) return 0;
    }
    flag = 1;
    for (int i = 1; i <= t; i++) {
        if (ans[i].size() == 1) {
            printf("Time step %d: The robber has been at %d,%d.\n", i, ans[i][0].first, ans[i][0].second);
            flag = 0;
        }
    }
    if (flag) return 1;
    return 2;
}
int main(){
    int cas = 0;
    while(scanf("%d%d%d",&h,&w,&t)){
        if(!h&&!w&&!t) break;
        init();
        for(int i = 1; i <= h; i++){
            for(int j = 1; j <= w; j++){
                dfs(i,j,1);
            }
        }
        printf("Robbery #%d:\n",++cas);
        int tmp = solve();
        if (tmp == 0) printf("The robber has escaped.\n");
        else if (tmp == 1) printf("Nothing known.\n");
        printf("\n");
    }
    return 0;
}

输出语句手打,打错了单词,wrong了好几次,不能再笨/////T_T


UVA 707 - Robbery

标签:uva

原文地址:http://blog.csdn.net/u013382399/article/details/44243613

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!