小明系列故事——玩转十滴水 腾讯马拉松时间模拟 HDOJ 4527

腾讯马拉松(时间模拟)题目连接


注意几个问题:

(1)水珠爆破的时候,下一刻才有四个飞溅的水珠

(2)我是先检查爆破的水珠后再移动飞溅的水珠,为了防止此刻产生的飞溅水珠再次移动,应该让爆破的4个水珠就在原地,也就是还没有移动

(3)为了防止飞溅的水珠被移动两个,应该用滚动数组,这次的水珠位置移动后存在另一个数组中


(2)方法还可以防止这种情况: 0550下一刻应该有两个水珠,如果不是原地爆破4个水珠在原地的话,可能会->0600->0000只有一个水珠了


经验,时间模拟最好用滚动数组


我的代码:

#include<stdio.h>
#include<string.h>
int der[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};


int map[7][7];
int drop[2][7][7][4], flag;                         //滚动数组分时间


int m;


int inMap(int x, int y)
{
if(x < 1 || y < 1 || x > 6 || y > 6)
return 0;
return 1;
}


int init()
{
int i, j;
for(i = 1; i <= 6; i ++)
for(j = 1; j <= 6; j ++)
{
if(scanf("%d", &map[i][j]) == EOF)
return 0;
}
scanf("%d", &m);
return 1;
}




int nextTime()
{
int x, y;
int f = 0;
int i, j, z;
memset(drop[1 - flag], 0, sizeof(drop[1 - flag]));

for(i = 1; i <= 6; i ++)                            //爆炸的水珠,计算下一时间的飞溅水珠
{
for(j = 1;j <= 6; j ++)
{
if(map[i][j] > 4)
{
map[i][j] = 0;
for(z = 0; z < 4; z ++)
{
drop[flag][i][j][z] ++;
}
}
}
}

for(i = 1; i <= 6; i ++)                           //飞溅的水珠,计算下一时间的水珠
{
for(j = 1;j <= 6; j ++)
{
for(z = 0; z < 4; z ++)
if(drop[flag][i][j][z])
{
x = i + der[z][0];
y = j + der[z][1];

if(inMap(x, y))
{
if(map[x][y])
{
map[x][y] += drop[flag][i][j][z];
}
else
{
drop[1 - flag][x][y][z] += drop[flag][i][j][z];
}
f = 1;
}
}
}
}
flag = 1 - flag;
return f;

}


int prin()
{
int i, j;
for(i = 1; i <= 6; i ++)
{
for(j = 1; j <= 6; j ++)
{
printf("%d", map[i][j]);
if(j != 6)
printf(" ");
}
printf("\n");
}
printf("\n");
return 0;
}




int main()
{
int i, x, y;
while(init())
{
for(i = 1; i <= m; i ++)
{
// prin();
flag = 0;
memset(drop[flag], 0, sizeof(drop[flag]));
scanf("%d%d", &x, &y);
map[x][y] ++;
while(nextTime());
}
prin();
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值