题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4527
这道题一开始做得时候没有思考周全,考虑了要爆炸的水滴的时间,但是没有考虑那些还没有爆炸的水珠应该在什么时候加1,这道题一定要以时刻来衡量。
当前的水珠爆炸,它的4个小水珠飞到相邻格子里是下一秒的事。还有就是对方向的保存,一开始我是4个方向都分别写上处理办法的,但是这样代码冗长。
下面看看AC代码,也让我自己受益匪浅。
#include<iostream> #include<string> #include<string> #include<string.h> #include<stdio.h> #include<queue> #include<math.h> #include<stdlib.h> #include<algorithm> #define maxn 10 using namespace std; int mapp[7][7]; int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}}; struct node{ int x,y; int d; node (){} node (int _x,int _y,int _d):x(_x),y(_y),d(_d) {} }; queue<node> q[2] ; //声明2个装node的容器 void bfs(int x,int y){ if(mapp[x][y]<4){ mapp[x][y]++; return; } int cur=0,next=1,f,g; mapp[x][y]=0; for(int i=0;i<4;i++){ f=x+dir[i][0]; g=y+dir[i][1]; if(f>=1&&f<=6&&g>=1&&g<=6){ q[cur].push(node(f,g,i)); } } node temp; while(!q[cur].empty()){ while(!q[cur].empty()){ temp=q[cur].front(); q[cur].pop(); if(mapp[temp.x][temp.y]==0){ f=temp.x+dir[temp.d][0]; g=temp.y+dir[temp.d][1]; if(f>=1&&f<=6&&g>=1&&g<=6) q[next].push(node(f,g,temp.d)); }else{ mapp[temp.x][temp.y]++; } } for(int i=1;i<=6;i++){ for(int j=1;j<=6;j++){ if(mapp[i][j]>=5){ mapp[i][j]=0; for(int k=0;k<4;k++){ f=i+dir[k][0]; g=j+dir[k][1]; if(f>=1&&f<=6&&g>=1&&g<=6) q[next].push(node(f,g,k)); } } } } swap(cur,next); } } int main(){ int m,x,y; while(~scanf("%d", &mapp[1][1])){ for(int i=1; i<=6; ++i){ for(int j=(i==1?2:1); j<=6; ++j){ scanf("%d", &mapp[i][j]); } } cin>>m; for(int i=0;i<m;i++){ cin>>x>>y; bfs(x,y); } for(int i=1;i<=6;i++){ for(int j=1;j<6;j++){ cout<<mapp[i][j]<<" "; } cout<<mapp[i][6]<<endl; } cout<<endl; } return 0; }