您的位置:首页 > 其它

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

2013-03-26 00:02 295 查看
腾讯马拉松(时间模拟)题目连接

注意几个问题:

(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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐