标签:
模拟十滴水游戏
r*c矩阵中,共有N个大水滴,求T秒后这N个水滴的状态
在0秒时在s_x,s_y位置有个水滴爆炸,生成向四周移动的小水滴,每个大水滴>4会爆炸,生成向四周移动的小水滴
把所有小水滴入队列,进行BFS即可,注意处理多个小水滴同时到达同一个大水滴的情况
#include "stdio.h" #include "string.h" #include "queue" using namespace std; const int dir[4][2]={ {1,0},{-1,0},{0,1},{0,-1} }; struct node { int x,y,dir; }; struct Mark { int x,y,cra; }mark[110]; int r,c,n,t,s_x,s_y; int mp[110][110],id[110][110]; void init() { int i,x,y,z; memset(mp,0,sizeof(mp)); memset(id,0,sizeof(id)); for (i=1;i<=n;i++) { scanf("%d%d%d",&x,&y,&z); mp[x][y]+=z; id[x][y]=i; mark[i].x=x; mark[i].y=y; mark[i].cra=0; } scanf("%d%d",&s_x,&s_y); } void bfs() { queue<node>q1,q2; node cur; int i,j,cnt,time; cur.x=s_x; cur.y=s_y; for (i=0;i<4;i++) { cur.dir=i; q1.push(cur); } time=0; cnt=0; while (time<t) { time++; while (!q1.empty()) { cur=q1.front(); q1.pop(); cur.x+=dir[cur.dir][0]; cur.y+=dir[cur.dir][1]; if (cur.x<1 || cur.y<1 || cur.x>r || cur.y>c) continue; mp[cur.x][cur.y]++; if (id[cur.x][cur.y]==0) q2.push(cur); } for (i=1;i<=n;i++) // 检查是否有新的大水滴爆炸 if (mark[i].cra==0) { if (mp[mark[i].x][mark[i].y]>4) { mp[mark[i].x][mark[i].y]=0; id[mark[i].x][mark[i].y]=0; mark[i].cra=time; cnt++; cur.x=mark[i].x; cur.y=mark[i].y; for (j=0;j<4;j++)// 生成新的4个小水滴 { cur.dir=j; q1.push(cur); } } } if (cnt==n) break; while (!q2.empty()) //将没有使大水滴爆炸的小水滴继续进队列 { cur=q2.front(); q2.pop(); if (mp[cur.x][cur.y]==0) continue; q1.push(cur); } } } void pri() { int i; for (i=1;i<=n;i++) if (mark[i].cra!=0) printf("0 %d\n",mark[i].cra); else printf("1 %d\n",mp[mark[i].x][mark[i].y]); } int main() { while (scanf("%d%d%d%d",&r,&c,&n,&t)!=EOF) { init(); bfs(); pri(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u011932355/article/details/47165343