您的位置:首页 > 其它

hdoj5336

2015-08-02 17:53 274 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5336

题意:水滴爆炸形成四滴水 指向上下左右四个方向 下一秒流向四周 ;小水滴(流动中的水) 碰到大水滴 大水滴立即爆炸 ;(若同时多个方向水滴汇集到一个大水滴(融合) 全部融入后大水滴才爆炸)。

解题思路:用队列去维护,不断的模拟。很恶心的题目。没什么太大的技巧。

#include <stdio.h>
#include <iostream>
#include <queue>
#include <memory.h>
#include <utility>

using namespace std;

const int MAX=100+5;
int matrix[MAX][MAX],matrix1[MAX][MAX];

int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int dir[]={1,2,3,4};

typedef struct Grid
{
int x;
int y;
int T;
int flag;
}Grid;

Grid grid[MAX];

typedef struct Drop
{
int x;
int y;
int dir;
}Drop;

int main()
{
int r,c,n,T;
while(~scanf("%d %d %d %d",&r,&c,&n,&T))
{
memset(matrix,0,sizeof(matrix));
memset(matrix1,0,sizeof(matrix1));
memset(grid,0,sizeof(grid));
queue<Drop> q1,q2;
queue<pair<int,int> > q3;
pair<int,int> pa;
int x,y,num;
for(int i=1;i<=n;i++)
{
scanf("%d %d %d",&x,&y,&num);
grid[i].x=x;
grid[i].y=y;
matrix[x][y]=num;
matrix1[x][y]=i;
}
scanf("%d %d",&x,&y);
Drop d,d1;
d.x=x;
d.y=y;
for(int i=0;i<4;i++)
{
d1.x=d.x+dx[i];
d1.y=d.y+dy[i];
d1.dir=dir[i];
if(d1.x>0&&d1.x<=r&&d1.y>0&&d1.y<=c)
{
q1.push(d1);
}
}
for(int i=1;i<=T;i++)
{
if(i&1)
{
while(q1.size())
{
d=q1.front();
q1.pop();
if(matrix[d.x][d.y]>0)
{
matrix[d.x][d.y]++;
if(matrix[d.x][d.y]>4)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>pa.first=d.x;
<span style="white-space:pre">				</span>pa.second=d.y;
<span style="white-space:pre">				</span>q3.push(pa);
<span style="white-space:pre">			</span>}
}
else
{
for(int j=0;j<4;j++)
{
if(dir[j]==d.dir)
{
d.x+=dx[j];
d.y+=dy[j];
if(d.x>0&&d.x<=r&&d.y>0&&d.y<=c)
{
q2.push(d);
}
}
}
}
}
}
else
{
while(q2.size())
{
d=q2.front();
q2.pop();
if(matrix[d.x][d.y]>0)
{
matrix[d.x][d.y]++;
if(matrix[d.x][d.y]>4)
<span style="white-space:pre">			</span>{
<span style="white-space:pre">				</span>pa.first=d.x;
<span style="white-space:pre">				</span>pa.second=d.y;
<span style="white-space:pre">				</span>q3.push(pa);
<span style="white-space:pre">			</span>}
}
else
{
for(int j=0;j<4;j++)
{
if(dir[j]==d.dir)
{
d.x+=dx[j];
d.y+=dy[j];
if(d.x>0&&d.x<=r&&d.y>0&&d.y<=c)
{
q1.push(d);
}
}
}
}
}
}
while(q3.size())
{
int j;
int k;
pa=q3.front();
q3.pop();
j=pa.first;
k=pa.second;
if(matrix[j][k]>4)
{
matrix[j][k]=0;
grid[matrix[j][k]].flag=0;
grid[matrix1[j][k]].T=i;
d.x=j;
d.y=k;
for(int z=0;z<4;z++)
{
d1.x=d.x+dx[z];
d1.y=d.y+dy[z];
d1.dir=dir[z];
if(d1.x>0&&d1.x<=r&&d1.y>0&&d1.y<=c)
{
if(i&1)
{
q2.push(d1);
}
else
{
q1.push(d1);
}
}
}
}
}
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
if(matrix[i][j])
{
grid[matrix1[i][j]].flag=1;
grid[matrix1[i][j]].T=matrix[i][j];
}
}
}
for(int i=1;i<=n;i++)
{
printf("%d %d\n",grid[i].flag,grid[i].T);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: