• [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;
    } 
    

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

  • 相关阅读:
    spring-cloud-feign案例
    spring-cloud-hystrix熔断
    科技创业公司最爱的9大工具箱
    近期入手一树莓派卡片机,体验了一下它的强大,写篇报告
    Android应用盈利广告平台的嵌入方法详解
    UnityVS(Visual Studio Tools For Unity)的安装与使用
    unity3d快捷键大全
    Unity3D Android手机开发环境配置,可真机发布调试
    谷歌最近收购的机器人公司
    Microsoft Robotics Developer Studio 4
  • 原文地址:https://www.cnblogs.com/kbyd/p/3227846.html
Copyright © 2020-2023  润新知