[HDU] 4527 小明系列故事——玩转十滴水

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=4527

方法:模拟,当一滴水滴在一个cell里后,如果不爆就直接给cell的值加1,否则,设置为0,模拟爆炸,再将爆炸一秒后水滴会出现的位置已经当前飞行的方向合成为一个状态结构并记录在一个数组的st到ed段,这里st=1,ed最多为4,因为爆炸一秒后水滴有可能已经飞离棋盘,然后扫面st到ed中的每个状态对应位置p,对p位置的水滴量q,如果q==0,则水滴会按当前方向继续往前飞,则下1秒水滴到达的新位置和与当前方向一样的方向合成为一个新的状态放在ed的后面;如果q!=0,则直接给相应位置的水滴量加1即可。然后再扫描st到ed段,对于所有水滴量大于4的位置模拟爆炸:将水滴量设置为0,将爆炸后下一秒水滴些会出现的位置和飞行方向设置为新的状态结构,同样记录在ed后面。最后扫面完后,将st设置为ed+1,ed设置为ed+[新产生的状态数量],再次用上述同样逻辑迭代扫描新的st到ed段,直到[新产生的状态数量]为0停止,当产生的状态数量]时, st=ed+1>ed,代码中会自动退出迭代,处理结束。

代码:

#include<iostream>
using namespace std;
int const MAX =100001;
int matrix[8][8];
int direction[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
struct Status
{
	int x,y;
	int direction;
};
void process(int x,int y)
{
	matrix[x][y]++;
	if(matrix[x][y]>4)
	{
		Status statuses[10000];
		int st=1,ed=0;
		matrix[x][y] = 0;
		Status n_status;
		for(int i=0;i<4;i++)
		{
			n_status.x = x+direction[i][0];
			n_status.y = y+direction[i][1];
			n_status.direction=i;
			if(matrix[n_status.x][n_status.y]!=-1)
			{
				ed++;
				statuses[ed] = n_status;
			}
		}
		while(st<=ed)
		{
			Status t_status;
			int j=0;
			for(int i=st;i<=ed;i++)
			{
				t_status= statuses[i];
				if(matrix[t_status.x][t_status.y]==0)
				{
					Status stt;
					stt.x=direction[t_status.direction][0]+t_status.x;
					stt.y=direction[t_status.direction][1]+t_status.y;
					stt.direction = t_status.direction;
					if(matrix[stt.x][stt.y]!=-1)
					{
						j++;
						statuses[ed+j] = stt;
					}
				}
				else
					matrix[t_status.x][t_status.y]++;
			}
			for(int i=st;i<=ed;i++)
			{
				t_status= statuses[i];
				if(matrix[t_status.x][t_status.y]>4)
				{
					matrix[t_status.x][t_status.y] = 0;
					Status stt;
					for(int i=0;i<4;i++)
					{
						stt.x = t_status.x+direction[i][0];
						stt.y = t_status.y+direction[i][1];
						stt.direction=i;
						if(matrix[stt.x][stt.y]!=-1)
						{
							j++;
							statuses[ed+j] = stt;
						}
					}
				}
			}
			st=ed+1;
			ed+=j;
		}
	}
}
int main()
{
	int m;
	memset(matrix,-1,sizeof(matrix));
    while(scanf("%d%d%d%d%d%d",&matrix[1][1],&matrix[1][2],&matrix[1][3],&matrix[1][4],&matrix[1][5],&matrix[1][6])!=EOF)
    {
		for(int i=2;i<=6;i++)
			for(int j=1;j<=6;j++)
				scanf("%d",&matrix[i][j]);
		scanf("%d",&m);
		int x,y;
		for(int i=0;i<m;i++)
		{
			scanf("%d%d",&x,&y);
			process(x,y);
		}
		for(int i=1;i<=6;i++)
		{
			for(int j=1;j<=6;j++)
			{
				if(j>1)
					cout<<" ";
				cout<<matrix[i][j];
			}
			cout<<endl;
		}
		cout<<endl;
		memset(matrix,-1,sizeof(matrix));
    }
    return 0;
} 

 感想:纯粹地模拟,考代码实现的

原文地址:https://www.cnblogs.com/kbyd/p/3227846.html