题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4527
这个和我们玩的3366游戏十滴水差不多,规则就是当水滴大于4的时候会爆裂像4个方向各传递一滴水。
有一点要注意的是,水滴的速度是相同的,所以可能有大于等于2滴水滴同时到达某一地方。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;
/*
freopen("input.txt", "r", stdin); //读数据
freopen("output.txt", "w", stdout); //注释掉此句则输出到控制台
*/
int xh[7][7],t[4][2]={1,0,-1,0,0,1,0,-1};//方向
int visit[7][7];//记录时间
struct xiaohao
{
int x,y,t,d;//x,y坐标,t代表时间,d代表方向
}w,e;
void dfs(int x,int y)
{
int i;
queue<xiaohao> q;
xh[x][y]++;
if(xh[x][y]>4)
{
visit[x][y]=0;
w.x=x;w.y=y;w.t=0;w.d=-1;
q.push(w);
}
while(!q.empty())
{
w=q.front();
q.pop();
if(w.d==-1)//w.d等与-1表示爆裂,其他表示分裂方向
xh[w.x][w.y]=0;
for(i=0;i<4;i++)
{
if(w.d!=-1&&w.d!=i)//如果不是爆裂也不是沿着原方向,则continue
continue;
int xx=w.x+t[i][0],yy=w.y+t[i][1];
if(xx>0&&xx<=6&&yy>0&&yy<=6)
{
if(xh[xx][yy]==0)
{
e.x=xx;e.y=yy;e.t=w.t+1;e.d=i;
q.push(e);
}
else if(xh[xx][yy]<4)//小于4,直接++
{
xh[xx][yy]++;
}
else if(xh[xx][yy]==4)//这个地方只能写等于4,因为有同时到达可能大于四
{
xh[xx][yy]++;
visit[xx][yy]=w.t+1;
e.x=xx;e.y=yy;e.t=w.t+1;e.d=-1;
q.push(e);
}
else
{
//如果快于或等于上一次到达,则++
if(w.t+1<=visit[xx][yy])
xh[xx][yy]++;
//比上一次慢那么继续前进
else
{
e.x=xx;e.y=yy;e.t=w.t+1;e.d=i;
q.push(e);
}
}
}
}
}
}
int main()
{
int i,j,x,y,m;
while(cin>>xh[1][1])
{
for(i=1;i<=6;i++)
for(j=1;j<=6;j++)
if(i!=1||j!=1)
scanf("%d",&xh[i][j]);
cin>>m;
while(m--)
{
memset(visit,-1,sizeof(visit));
scanf("%d%d",&x,&y);
dfs(x,y);
}
for(i=1;i<=6;i++)
printf("%d %d %d %d %d %d\n",xh[i][1],xh[i][2],xh[i][3],xh[i][4],xh[i][5],xh[i][6]);
printf("\n");
}
return 520;
}