小明系列故事——玩转十滴水 腾讯马拉松时间模拟 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;
}
注意几个问题:
(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;
}
相关文章推荐
- hdu 4527 小明系列故事——玩转十滴水(模拟+BFS)
- HDU 4527 小明系列故事——玩转十滴水 2013腾讯编程马拉松初赛第五场第二题
- HDU-4527 小明系列故事——玩转十滴水 模拟
- [HDU] 4527 小明系列故事——玩转十滴水
- HDU 4527 小明系列故事——玩转十滴水
- HDOJ4500 小Q系列故事——屌丝的逆袭(简单模拟) &&腾讯2013编程马拉松第0场第一题
- HDOJ4505 小Q系列故事——电梯里的爱情(简单模拟) && 腾讯2013编程马拉松第1场第一题
- Hdu 4527 小明系列故事——玩转十滴水
- HDU - 4527 小明系列故事――玩转十滴水
- HDU 4527 小明系列故事——玩转十滴水
- hdu 4527 小明系列故事——玩转十滴水 bfs 解题报告
- hdu 4527 ——小明系列故事——玩转十滴水
- hdu 4527 小明系列故事——玩转十滴水
- 腾讯马拉松 第三场 1003 小小明系列故事——游戏的烦恼 大水题
- 腾讯第二届编程马拉松初赛3月21日晚第二题之小明系列故事——师兄帮帮忙
- [2013腾讯马拉松 3月23日]HDU 4517 小小明系列故事——游戏的烦恼
- hdu4527小明系列故事——玩转十滴水 (BFS+DFS)
- 2013腾讯编程马拉松初赛第一场(3月21日) 小明系列故事——师兄帮帮忙 !!快速幂取摸
- HDOJ4502 吉哥系列故事——临时工计划(动态规划)&& 腾讯2013编程马拉松第0场第三题
- HDOJ 4509 湫湫系列故事——减肥记II(2013腾讯编程马拉松)