UVA 707 - Robbery

搜啊搜~~~~~~~

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

时间: 2024-10-24 21:20:29

UVA 707 - Robbery的相关文章

UVA 707 - Robbery(记忆化搜索)

UVA 707 - Robbery 题目链接 题意:在一个w * h的图上,t个时刻,然后知道一些信息,每个时刻没有小偷的矩阵位置,问哪些时刻可以唯一确定小偷位置,和确定小偷是否已经逃走,如果没逃走,但是也没有时刻可以可以确定小偷位置,就是不知到 思路:记忆化搜索,dp[x][y][ti]表示在x,y位置,ti时刻时候,小偷是否可能出现在这个位置,1表示有可能,0表示没可能,由于小偷一次最多只能上下左右走一步或者不走,所以去dfs一遍即可 最后判断的时候,如果有一个时刻没有一个1,就表示已经逃走

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

UVA - 11437 - Triangle Fun (计算几何~)

UVA - 11437 Triangle Fun Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem A Triangle Fun Input: Standard Input Output: Standard Output In the picture below you can see a triangle ABC. Point D, E

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

[UVa] Palindromes(401)

UVA - 401 Palindromes Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A regular palindrome is a string of numbers or letters that is the same forward as backward. For example, the string "ABCDED