注意几个问题:
(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;
}