试题编号: | 201604-2 |
试题名称: | 俄罗斯方块 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。 输入格式 输入的前15行包含初始的方格图,每行包含10个数字,相邻的数字用空格分隔。如果一个数字是0,表示对应的方格中没有方块,如果数字是1,则表示初始的时候有方块。输入保证前4行中的数字都是0。 输出格式 输出15行,每行10个数字,相邻的数字之间用一个空格分隔,表示板块下落后的方格图。注意,你不需要处理最终的消行。 样例输入 0 0 0 0 0 0 0 0 0 0 样例输出 0 0 0 0 0 0 0 0 0 0 |
问题链接:CCF201604-2 俄罗斯方块
问题分析:按行计算各非空行下降的最大距离,板块图案的最大下降距离就是各非空行下降最大距离的最小值。
程序说明:在方格图底部多加一行并使之为1,这样避免判断出界的问题,这是程序的一个技巧。
提交后得100分的C++程序:
#include<iostream>
using namespace std;
int a[17][11];
int b[5][5];
int main()
{
int i,j,k,n;
//读入15行10列的初始方格图
for(i=1;i<=15;i++)
for(j=1;j<=10;j++)
cin>>a[i][j];
//技巧,在方格图底部多加一行并使之为1,这样避免判断出界的问题
for(j=1;j<=10;j++)
a[16][j]=1;
//读入4行4列的板块图案
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
cin>>b[i][j];
cin>>n;
//求出最大下降距离d,初始为15
int d=15;
for(i=4;i>0;i--){ //计算板块图案每行最大的下降距离
int sum=0;
for(k=1;k<=4;k++)
sum+=b[i][k];
if(sum==0)//如果这是一个空行,就不用判断
continue;
int t=0;//初始下降距离为0
for(j=i+1;j<=16;j++){//从此行的下一行开始判断
for(k=1;k<=4;k++)
if(b[i][k]+a[j][n+k-1]==2)
break;
if(k==5)
t++;
else
break;
}
d=min(d,t);
}
for(i=1;i<=4;i++)
for(j=1;j<=4;j++)
if(b[i][j]==1)
a[i+d][n+j-1]=1;
//输出变换后的结果
for(i=1;i<=15;i++){
for(j=1;j<=10;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
针对zsongzhaop的提问:如果采用从下往上的顺序寻找合适的行,要记得考虑这种情况。