问题描述
试题编号: | 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 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
中每一列的“最大下降距离”,第一列,全部都是0,那么我可以默认它最大的下降距离为16了(就一个比较大的数字,15行,这样也不会太离谱),然后第二列,第二列的最大下降距离是13(也就是可以到底了),第三列是12,因为在第15行有一个1,然后第四列的最大下降距离也是12,因为第四列最低端的1位于第三行,第三行到第十五行中间都没有1,所以它的最大下降距离就是12
计算出了四列的最大下降距离之后,我们就可以进行赋值了。首先挑选这四个最大下降距离的最小值(因为我们要保证它碰到砖块,也就是“1”的时候就停在那。)
有了这个最大下降距离,我们就可以进行赋值了
#include<iostream>
using namespace std;
int main()
{
int arr[20][20]={0};//进行储存一开始的局面
for(int i=1;i<=15;i++)
{
for(int j=1;j<=10;j++)
{
cin>>arr[i][j];
}
}
int pic[20][20]={0};//用来储存那个要掉落的方块
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cin>>pic[i][j];
}
}
int no=0;
cin>>no;
int distance[5]={16,16,16,16,16};//统统初始化为16
//计算每一列下降最大距离
for(int l=1;l<=4;l++)
{
int button=0;
for(int h=1;h<=4;h++)//先找到每一列最底部的方块位于第几行
{
if(pic[h][l]==1)
button=h;
}
if(button==0)
continue;
else
{
int dis=0;
int j=l+no-1;
for(int i=button+1;i<=15;i++)
{
if(arr[i][j]!=1)
dis++;//计算该列最大距离
else
break;
}
distance[l]=dis;
}
}
//计算下降最小距离
int min=distance[1];
for(int i=2;i<=4;i++)
{
if(distance[i]<min)
min=distance[i];
}
//赋值了
for(int l=1;l<=4;l++)
{
for(int h=1;h<=4;h++)
{
arr[h+min][l+no-1]+=pic[h][l];
}
}
for(int i=1;i<=15;i++)
{
for(int j=1;j<=10;j++)
{
if(j==1)
cout<<arr[i][j];
else
cout<<" "<<arr[i][j];
}
cout<<endl;
}
}