试题编号: | 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 |
问题分析:首先我们计算要下降的的位置中每一列的“最大下降距离”,样例中第一列,全部都是0,那么我可以默认它最大的下降距离为15,第二列的最大下降距离是13,第三列是12,因为在第15行有一个1,第四列的最大下降距离也是12。计算出了四列的最大下降距离之后,挑选这四个最大下降距离的最小值有了这个下降距离,就可以进行赋值了。
#include <iostream>
using namespace std;
int main()
{
int a[20][20]={0};
for(int i=1;i<=15;i++)
{
for(int j=1;j<=10;j++)
{
cin>>a[i][j];
}
}
int p[20][20]={0};//用来储存那个要掉落的方块
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cin>>p[i][j];
}
}
int n;
cin>>n;
int m=0;
int d[4]={15,15,15,15};//存储最大下降长度
for(int j=1;j<=4;j++)
{
int h=0;
for(int i=1;i<=4;i++)
{
if(p[i][j]==1)
{
h=i;
}
}
if(h!=0)
{
int l=j+n-1;//下落部分的第j列对应大图的第l列
int k;
int s=0;
for(k=1;k<16;k++)
{
//以下注释部分错误
// if(a[k][l]==1)
// {
// d[j-1]=k-1-h;
// break;
// }
if(a[k][l]==0)
{
s++;
}
else
{
d[j-1]=s-h;
break;
}
}
if(k==16)
{
d[j-1]=15-h;
}
}
else
{
continue;
}
}
int min=d[0];//找最短的下降高度
for(int i=1;i<4;i++)
{
if(d[i]<min)
{
min=d[i];
}
}
for(int j=1;j<=4;j++)
{
for(int i=1;i<=4;i++)
{
a[i+min][j+n-1]+=p[i][j];
}
}
for(int i=1;i<=15;i++)
{
for(int j=1;j<=10;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}