hdu5336 XYZ and Drops (模拟+vector删除第i个元素)

题目链接:

hdu5336 XYZ and Drops

模拟题一道,比较水,但是因为题意曲折

顺带vector的删除操作也是不太明白

总之逗了很长时间

删除第i个元素

v.erase(v.begin() + i);

删完后后面的元素都会往前移一个,所以下一个元素还是v[i]

也可以下面这样

it = v.erase(it); //erase()返回值是指向下一个元素的指针

//#define __LOCAL
//#define __LLD

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <map>
#include <iostream>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int ninf = 0x80000000;
const int inf = 0x7FFFFFFF;
const LL INF = (LL)inf*inf;

#ifdef __LLD
    #define printLLln(x) printf("%lld\n", x)
    #define printLL(x) printf("%lld", x)
#else
    #define printLLln(x) printf("%I64d\n", x)
    #define printLL(x) printf("%I64d", x)
#endif

#define MP make_pair
#define PB push_back

//
struct LI
{
    int x,y;
    int dx,dy;
    LI(){}
    LI(int _x,int _y,int _dx, int _dy)
    :x(_x),y(_y),dx(_dx),dy(_dy){}
};

const int MAXN = 102;
int n,r,c,T;
vector<LI> w;
int m[MAXN][MAXN];
int mm[MAXN][MAXN];
vector<PII> mmm;
int res[MAXN];

void init()
{
    memset(m,0,sizeof m);
    w.clear();
    memset(mm, 0, sizeof(mm));
    mmm.clear();
    memset(res,-1,sizeof(res));
}
void solve()
{
    init();
    int x,y,s;
    mmm.PB(MP(0,0));
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d%d", &x,&y,&s);
        m[x][y] = s;
        mm[x][y] = i;
        mmm.PB(MP(x,y));
    }
    scanf("%d%d", &x,&y);
    w.push_back(LI(x,y,1,0));
    w.push_back(LI(x,y,-1,0));
    w.push_back(LI(x,y,0,1));
    w.push_back(LI(x,y,0,-1));

    bool dis;
    for(int i=1;i<=T;++i)
    {
        for(int j = 0; j < w.size();)
        {
            dis = false;
//            printf("%d %d %d %d\n", w[j].x, w[j].y, w[j].dx, w[j].dy);
            w[j].x += w[j].dx;
            w[j].y += w[j].dy;
            if(w[j].x > r || w[j].x < 1 || w[j].y > c || w[j].y < 1)
                dis = true;
            else if(m[w[j].x][w[j].y] > 0){
                m[w[j].x][w[j].y] += 1;
                dis = true;
            }
            if(dis){
                w.erase(w.begin()+j);
            }
            else
                ++j;
        }
        for(int j=1;j<=n;++j)
        {
            int xx = mmm[j].first;
            int yy = mmm[j].second;
            if(m[xx][yy] > 4){
                m[xx][yy] = 0;
                res[mm[xx][yy]] = i;
                w.push_back(LI(xx,yy,1,0));
                w.push_back(LI(xx,yy,-1,0));
                w.push_back(LI(xx,yy,0,1));
                w.push_back(LI(xx,yy,0,-1));
            }
        }

    }

    for(int i=1;i<=n;++i)
    {
        if(res[i]!=-1){
            printf("0 %d\n",res[i]);
        }
        else{
            printf("1 %d\n",m[mmm[i].first][mmm[i].second]);
        }
    }

}
int main()
{
#ifdef __LOCAL
    freopen("/Users/apple/Documents/xcode/contest/data.in", "r", stdin);
//    freopen("/Users/apple/Documents/xcode/contest/data.out", "w", stdout);
#endif
//    int T;
////    int num=0;
//    scanf("%d",&T);
//    while(T--){
////        printf("Case #%d: ",++num);
//        solve();
//    }
//
    while(scanf("%d%d%d%d", &r,&c,&n,&T)!=EOF){
        solve();
    }
    return 0;
}

时间: 2024-10-05 06:38:14

hdu5336 XYZ and Drops (模拟+vector删除第i个元素)的相关文章

解题报告 之 HDU5336 XYZ and Drops

解题报告 之 HDU5336 XYZ and Drops Description XYZ is playing an interesting game called "drops". It is played on a  grid. Each grid cell is either empty, or occupied by a waterdrop. Each waterdrop has a property "size". The waterdrop cracks

Hdu 5336 XYZ and Drops (bfs 模拟)

题目链接: Hdu 5336 XYZ and Drops 题目描述: 有一个n*m的格子矩阵,在一些小格子里面可能会有一些水珠,每个小水珠都有一个size.现在呢,游戏开始咯,在一个指定的空的小格子里面有一个将要向四周爆裂的水珠,在下一面分别向上,下,左,右四个方向发射一个小水滴,(小水滴与水珠同,小水滴没有size),当小水滴走向一个格子,这个格子如果是空或者有其他的小水滴同时走到这个格子的情况下,对小水滴的运动轨迹是不影响的.但是遇到水珠的话,小水滴就会被吸收,水珠每次吸收一个小水滴size

HDU 5336 XYZ and Drops (模拟+搜索,详解)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5336 题面: XYZ and Drops Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 725    Accepted Submission(s): 201 Problem Description XYZ is playing an in

XYZ and Drops (hdu 5336 bfs)

XYZ and Drops Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 588    Accepted Submission(s): 157 Problem Description XYZ is playing an interesting game called "drops". It is played on a r?

HDU 5336——XYZ and Drops——————【广搜BFS】

XYZ and Drops Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1250    Accepted Submission(s): 407 Problem Description XYZ is playing an interesting game called "drops". It is played on a r∗

vector中删除第k个元素的巧妙方法

假设我们定义了一个vector如下: vector<int> v;v.push_back(1);...v.push_back(255); 如果要删除第k个元素的话,应该这样写: (1)如果k是第0个 vector<int>(v.begin() + 1, v.end()).swap(v); (2)如果k是最后一个, v.pop_back(); (3)其他情况下 vector<int> v_c(v.begin() + k + 1, v.end()); v.resize(k)

Vector 删除元素

数据结构上机测试1:顺序表的应用 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 在长度为n(n<1000)的顺序表中可能存在着一些值相同的"多余"数据元素(类型为整型),编写一个程序将"多余"的数据元素从顺序表中删除,使该表由一个"非纯表"(值相同的元素在表中可能有多个)变成一个"纯表"(值相同的元素在表中只能有一个). 输入 第一行输入表的长度n:

怎么删除STL容器的元素

在STL容器有顺序容器和关联容器两种. 顺序容器删除元素的方法有两种: 1.c.erase(p) 从c中删除迭代器p指定的元素.p必须指向c中一个真实元素,不能等于c.end().返回一个指向p之后元素的迭代器,若p指向c中的尾元素,则返回c.end() 2.3.c.erase(b,e) 删除迭代器对b和e所代表的范围中的元素.返回e 关联容器删除元素的方法有三种: 1.c.erase(k) 从c中删除每一个关键字为k的元素.返回一个size_type值,指出删除的元素的数量. 2.c.eras

操作DOM元素,Dom元素添加颜色,删除第二个li元素

<html> <head> <title>demo</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"> /* 示例操作DOM元素 */ window.onload = function(){ //给Dom元素添