[搜索]hdu5336

題意:
有一個r 行 c 列的格子,給出n個格子裏有水滴的大小。再給出時間限制T,使得水滴從(sx,sy)位置開始爆破,當飛漸的水遇到格子裏的靜態水時就會聚在一起,當聚集的水滴大小>4時就會爆破。問在T時給定的n個位置格子裏的水滴情況,如果沒有爆破就輸出:1 格子裏水滴大小。否則輸出:0 爆破的時間。

分析 :見代碼註釋。



#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long

const int maxn = 103;
using namespace std;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int r,c,n,t,si,sj;
struct Node
{
    int x,y,dir,time;
}node[maxn];
int size[maxn][maxn],st[maxn][maxn];

void bfs(int x,int y)
{
    int i;
    Node cur,pre;
    cur.x=x;cur.y=y;
    cur.time=0;
    cur.dir=-1; //表示要爆裂 
    queue<Node> q;
    q.push(cur);
    while(!q.empty())
    {
        pre=q.front();
        q.pop();

        if(pre.dir>=0) //如果不爆裂 按照原來的方向停止或者移動 
        {
            int tx=pre.x+dx[pre.dir]; //按照原來的方向停止或者移動 
            int ty=pre.y+dy[pre.dir];
            cur.x=tx;cur.y=ty;
            cur.time=pre.time+1;
            if(tx>=1 && tx<=r && ty>=1 && ty<=c && cur.time<=t)
            {
                if(size[tx][ty]) //如果有水珠擋住 
                {
                    size[tx][ty]++;
                    if(size[tx][ty]==5)
                    {
                        cur.dir=-1;
                        q.push(cur); //push放到裏面,如果水滴是靜止的就不用push了 
                    }

                }
                else  //如果遇到的是空格 
                {
                    cur.dir=pre.dir;
                    q.push(cur);
                }
            }
        }
        else //如果爆裂 按照爆裂的方向移動 
        {
            st[pre.x][pre.y]=pre.time; //標記爆裂時間
            size[pre.x][pre.y]=0; //放到這裏是要處理如果同時有多個水滴流向該點,而該點早已經是4了的情況  
            for(i=0;i<4;i++)
            {
                int tx=pre.x+dx[i];
                int ty=pre.y+dy[i];
                cur.x=tx;cur.y=ty;
                cur.time=pre.time+1;
                if(tx>=1 && tx<=r && ty>=1 && ty<=c && cur.time<=t)
                {
                    if(size[tx][ty]) //如果有水珠擋住 
                    {
                         size[tx][ty]++;
                         if(size[tx][ty]==5)
                         {
                             cur.dir=-1;
                             q.push(cur); //push放到裏面,如果水滴是靜止的就不用push了 
                         }

                    }
                    else  //如果遇到的是空格 
                    {
                        cur.dir=i;
                        q.push(cur);
                    }
                }
            }

         } 
    }


}
int main()
{
//  read;
    while(~scanf("%d%d%d%d",&r,&c,&n,&t))
    {
        int i,j,sz;
        memset(size,0,sizeof(size));
        memset(st,0,sizeof(st));
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&node[i].x,&node[i].y,&sz);
            size[node[i].x][node[i].y]=sz;
        }
        scanf("%d%d",&si,&sj);
        bfs(si,sj);
        for(i=0;i<n;i++)
        {
            int tx=node[i].x,ty=node[i].y;
            if(size[tx][ty]==0)
                cout<<"0 "<<st[tx][ty]<<endl;
            else cout<<"1 "<<size[tx][ty]<<endl;
        }
    }


} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章