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

hdu_5536_多校联赛4_1010

时间:2015-07-31 23:38:01      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:模拟

啊啊啊,简直要崩溃,题意是说有很多大水滴,当大水滴尺寸>=5时,会分裂成四个小水滴,然后向上下左右四个方向射去,当碰到另一个大水滴时就会融合到里面去,问你T时刻的状态。
思路极为简单的模拟,只需要模拟小水滴的状态就行,但是当时比赛现场管理员有很多误导,导致很多人不能够正确理解题意,首先,R为X的范围,C为Y的范围,admin直接说反,爆WA,其次,当大水滴分裂之后,原地点的状态表述不明,既然SIZE为0,那么以后由小水滴凝聚的时候会不会再次融合,这个地方就需要枚举题意,差评。
最后,放速度更快代码以示嘲讽,勿喷。
技术分享
技术分享
偶对,再放一组神数据
94 98 7 200
30 21 4
18 4 4
18 46 3
36 21 3
11 5 4
30 5 3
18 21 4
22 5
ANS:
0 46
0 75
0 117
0 76
0 11
0 30
0 58

#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int dx[4] = { 0, 1, 0, -1 };
const int dy[4] = { 1, 0, -1, 0 };
struct point{
    int x,y;
    int size;
}a[105];
struct yu{
    int x,y;
    int dir;
};
struct map{
    int size;
    int time;
}m[105][105];
int main(){
    freopen("in.txt","r",stdin);
    queue <yu> q2;
    queue <yu> q1;
    int r,c,n,t;
    int x,y;
    yu tmp,tt;
    while(~scanf("%d%d%d%d",&r,&c,&n,&t)){
        memset(m,0,sizeof(m));
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].size);
            m[a[i].x][a[i].y].size=a[i].size;
        }
        scanf("%d%d",&x,&y);
        for(int i=0;i<=3;i++){
            if(x+dx[i]<=r&&x+dx[i]>0&&y+dy[i]<=c&&y+dy[i]>0){
                tmp.x=x;
                tmp.y=y;
                tmp.dir=i;
                q1.push(tmp);
            }
        }
        for(int i=1;i<=t;i++){
            while(1){
                if(i%2){
                    if(q1.empty()) break;
                    tmp=q1.front();
                    q1.pop();
                }
                else{
                    if(q2.empty()) break;
                    tmp=q2.front();
                    q2.pop();
                }
                x=tmp.x+dx[tmp.dir];
                y=tmp.y+dy[tmp.dir];
                if(!(x<=r&&x>0&&y<=c&&y>0)) continue;
                tt.x=x;
                tt.y=y;
                tt.dir=tmp.dir;
                if(m[x][y].size) m[x][y].size++;
                else {
                    if(i%2) q2.push(tt);
                    else q1.push(tt);
                }
            }
            for(int j=1;j<=n;j++)
                if(m[a[j].x][a[j].y].size>=5){
                    m[a[j].x][a[j].y].time=i;
                    m[a[j].x][a[j].y].size=0;
                    for(int jj=0;jj<=3;jj++)
                        if(a[j].x+dx[jj]<=r&&a[j].x+dx[jj]>0&&a[j].y+dy[jj]<=c&&a[j].y+dy[jj]>0){
                            tmp.x=a[j].x;
                            tmp.y=a[j].y;
                            tmp.dir=jj;
                            if(i%2) q2.push(tmp);
                            else q1.push(tmp);
                        }
                }
        }
        for(int i=1;i<=n;i++){
            if(m[a[i].x][a[i].y].time>0) printf("0 %d\n",m[a[i].x][a[i].y].time);
            else printf("1 %d\n",m[a[i].x][a[i].y].size);
        }
        while(!q1.empty()) q1.pop();
        while(!q2.empty()) q2.pop();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu_5536_多校联赛4_1010

标签:模拟

原文地址:http://blog.csdn.net/bryant03/article/details/47176791

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