# include <stdio.h>
# include <string.h>
int box[5][8];
int N;
bool kill[5][7];
int X[6], Y[6], C[6];
bool fresh()
{
memset(kill , 0 , sizeof(kill));
bool f = 0;
int i, j, k;
for(i = 0 ; i < 5 ; i++)
{
for(j = 0 ; j < 7 ; j++)
{
if(j + 2 < 7 && box[i][j] && box[i][j] == box[i][j + 1] && box[i][j] == box[i][j + 2])
{
k = 0;
while(k + j < 7 && box[i][j] == box[i][j + k])
kill[i][j + k++] = 1;
f = 1;
}
if(i + 2 < 5 && box[i][j] && box[i][j] == box[i + 1][j] && box[i][j] == box[i + 2][j])
{
k = 0;
while(k + i < 5 && box[i][j] == box[i + k][j])
kill[i + k++][j] = 1;
f = 1;
}
}
}
for(i = 0 ; i < 5 ; i++)
{
for(j = 0 ; j < 7 ; j++)
if(kill[i][j])
box[i][j] = 0;
}
for(i = 0 ; i < 5 ; i++)
{
k = 0;
for(j = 0 ; j < 7 ; j++)
if(box[i][j])
box[i][k++] = box[i][j];
for(j = k ; j < 7 ; j++)
box[i][j] = 0;
}
return f;
}
void solve()
{
int i, j, k;
for(i = 0 ; i < N ; i++)
{
int x = X[i], y = Y[i], g = C[i];
if(!box[x][y] || x + g < 0 || x + g > 4)
{
puts("Runtime Error");
return;
}
int c = box[x + g][y];
box[x + g][y] = box[x][y];
box[x][y] = c;
k = 0;
for(j = 0 ; j < 7 ; j++)
if(box[x][j])
box[x][k++] = box[x][j];
for(j = k ; j < 7 ; j++)
box[x][j] = 0;
k = 0;
for(j = 0 ; j < 7 ; j++)
if(box[x + g][j])
box[x + g][k++] = box[x + g][j];
for(j = k ; j < 7 ; j++)
box[x + g][j] = 0;
while(fresh())
;
}
for(i = 0 ; i < 5 ; i++)
{
if(box[i][0])
{
puts("Wrong Answer");
return;
}
}
puts("Accepted");
}
int main()
{
while(~scanf("%d", &N))
{
memset(box , 0 , sizeof(box));
int i, j, k;
for(i = 0 ; i < 5 ; i++)
{
for(j = 0 ; j < 8 ; j++)
{
scanf("%d", &box[i][j]);
if(!box[i][j])
break;
}
}
for(i = 0 ; i < N ; i++)
scanf("%d %d %d", &X[i], &Y[i], &C[i]);
solve();
}
return 0;
}
先贴代码吧,刚才一不小心所有的话都没了,伤心。
说一说想法
1大模拟题都有一个通病,看着挺简单,但很快可能就会被代码和bug淹没,所以要保持耐心,尽量不要犯错。
2数组尽量开的大一点,留出富裕,这样能避免一些隐患。
然后是做法
先是判断是否可以交换,然后进行交换,整合,然后重复删除整合的操作直到没有删除的地方为止,有两个重点,删除和整合,删除的时候要注意有一些删除的地方是有重复的,比如一个十字,如果你先把竖着的删了,横着的左右两个部分就删不了了,所以我的做法是把要不要删除用一个bool数组储存起来,最后再进行删除。整合我是参考的字符串的删除进行的,因为相当于把0的部分删掉,但要注意一点,那就是字符串最后加一个0就好了,但是这道题要把后面全部清零,这个地方方式也坑了我一下。其实这道题真的不难,但是细致的确是一个关键,我虽然很讨厌大模拟,但我心里也清楚这种类型的题目其实才是最贴近真实的,所以也要好好做啊。