标签:模拟
啊啊啊,简直要崩溃,题意是说有很多大水滴,当大水滴尺寸>=5时,会分裂成四个小水滴,然后向上下左右四个方向射去,当碰到另一个大水滴时就会融合到里面去,问你T时刻的状态。
思路极为简单的模拟,只需要模拟小水滴的状态就行,但是当时比赛现场管理员有很多误导,导致很多人不能够正确理解题意,首先,R为X的范围,C为Y的范围,admin直接说反,爆WA,其次,当大水滴分裂之后,原地点的状态表述不明,既然SIZE为0,那么以后由小水滴凝聚的时候会不会再次融合,这个地方就需要枚举题意,差评。
最后,放速度更快代码以示嘲讽,勿喷。
偶对,再放一组神数据
94 98 7 200
30 21 4
18 4 4
18 46 3
36 21 3
11 5 4
30 5 3
18 21 4
22 5
ANS:
0 46
0 75
0 117
0 76
0 11
0 30
0 58
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int dx[4] = { 0, 1, 0, -1 };
const int dy[4] = { 1, 0, -1, 0 };
struct point{
int x,y;
int size;
}a[105];
struct yu{
int x,y;
int dir;
};
struct map{
int size;
int time;
}m[105][105];
int main(){
freopen("in.txt","r",stdin);
queue <yu> q2;
queue <yu> q1;
int r,c,n,t;
int x,y;
yu tmp,tt;
while(~scanf("%d%d%d%d",&r,&c,&n,&t)){
memset(m,0,sizeof(m));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].size);
m[a[i].x][a[i].y].size=a[i].size;
}
scanf("%d%d",&x,&y);
for(int i=0;i<=3;i++){
if(x+dx[i]<=r&&x+dx[i]>0&&y+dy[i]<=c&&y+dy[i]>0){
tmp.x=x;
tmp.y=y;
tmp.dir=i;
q1.push(tmp);
}
}
for(int i=1;i<=t;i++){
while(1){
if(i%2){
if(q1.empty()) break;
tmp=q1.front();
q1.pop();
}
else{
if(q2.empty()) break;
tmp=q2.front();
q2.pop();
}
x=tmp.x+dx[tmp.dir];
y=tmp.y+dy[tmp.dir];
if(!(x<=r&&x>0&&y<=c&&y>0)) continue;
tt.x=x;
tt.y=y;
tt.dir=tmp.dir;
if(m[x][y].size) m[x][y].size++;
else {
if(i%2) q2.push(tt);
else q1.push(tt);
}
}
for(int j=1;j<=n;j++)
if(m[a[j].x][a[j].y].size>=5){
m[a[j].x][a[j].y].time=i;
m[a[j].x][a[j].y].size=0;
for(int jj=0;jj<=3;jj++)
if(a[j].x+dx[jj]<=r&&a[j].x+dx[jj]>0&&a[j].y+dy[jj]<=c&&a[j].y+dy[jj]>0){
tmp.x=a[j].x;
tmp.y=a[j].y;
tmp.dir=jj;
if(i%2) q2.push(tmp);
else q1.push(tmp);
}
}
}
for(int i=1;i<=n;i++){
if(m[a[i].x][a[i].y].time>0) printf("0 %d\n",m[a[i].x][a[i].y].time);
else printf("1 %d\n",m[a[i].x][a[i].y].size);
}
while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:模拟
原文地址:http://blog.csdn.net/bryant03/article/details/47176791