hdu5336&15年多校集训(4)j题(bfs+模拟)

来源:互联网 发布:mac口红rebel试色 编辑:程序博客网 时间:2024/04/29 16:56
题目大意:r*c的方格矩阵中,有n顆大水滴,给出位置和大小(表示为小水珠的数量)。当大水滴的大小超过4时,便会爆裂,变成四颗小水珠,往四个方向运动。小水珠相遇时不会发生碰撞,小水珠和大水滴相遇时相融合。这一秒大水滴爆裂时,四颗小水珠会在同一个格子中,下一秒才会运动。

一开始在位置(A,B)爆裂一颗大水滴。求出T秒是每颗大水滴的状态。

解题思路:这道题不难,但因为题意曲折,而且有些细节问题导致一直wa,基本思路是bfs,利用队列,每次t秒拓展一次结点,然后每次统计下统计队列长度,再搞个变量出来,直到每次出队一个元素,变量-1

注意点:两个水滴同一时刻,进入同一大水珠,并且大水珠子破裂,容易忽略第二颗水珠,让他在他的方向多一颗水珠。他的方向上应该只能算一颗水珠。

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<queue>using namespace std;const int maxn=110;int r,c,n,T,s_x,s_y;int times[maxn][maxn],s[maxn][maxn];//time用于记录到达时间,s用于记录当前棋盘的状态int x[maxn],y[maxn];struct node{        int x,y,dir;        node(int x,int y,int dir):x(x),y(y),dir(dir){}};int dx[]={0,1,0,-1,0};int dy[]={0,0,1,0,-1};int inside(int x,int y){        if(x<1||x>r||y<1||y>c)  return 0;        else return 1;}void solve(){       queue<node> q;       for(int i=1;i<=4;i++)        q.push(node(s_x,s_y,i));       for(int t=1;t<=T;t++)       {               int len=q.size();               if(len==0) return;               while(len--)               {                       node v=q.front();q.pop();                       int  new_x=v.x+dx[v.dir];                       int  new_y=v.y+dy[v.dir];                       if(inside(new_x,new_y))                       {                               if(times[new_x][new_y]==t)   continue;                               if(s[new_x][new_y])                               {                                       s[new_x][new_y]++;                                       if(s[new_x][new_y]>4)                                       {                                               s[new_x][new_y]=0;                                               times[new_x][new_y]=t;                                               for(int i=1;i<=4;i++)                                                 q.push(node(new_x,new_y,i));                                       }                               }                               else q.push(node(new_x,new_y,v.dir));                       }               }       }}int main(){        while(scanf("%d%d%d%d",&r,&c,&n,&T)!=EOF)        {                memset(times,0,sizeof(times));                memset(s,0,sizeof(s));                int tmp;                for(int i=1;i<=n;i++)                {                        scanf("%d%d%d",&x[i],&y[i],&tmp);                        s[x[i]][y[i]]=tmp;                }                scanf("%d%d",&s_x,&s_y);                solve();                for(int i=1;i<=n;i++)                {                        if(s[x[i]][y[i]]==0)                        {                                printf("0 %d\n",times[x[i]][y[i]]);                        }                        else printf("1 %d\n",s[x[i]][y[i]]);                }        }}


0 0
原创粉丝点击