试题编号: | 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 |
思路:依次求出每一块下落的最大距离取最小值,方法是每次横坐标加1判断大图
对应位置处是1是0,是0的话继续下落,直至为1表示有阻碍不能继续下降,
累加求下降距离。然后根据最小下落距离将方块最终降落在大图里的位置赋值1。
/*
依次求出每一块下落的最大距离取最小值,方法是每次横坐标加1判断大图
对应位置处是1是0,是0的话继续下落,直至为1表示有阻碍不能继续下降,
累加求下降距离。然后根据最小下落距离将方块最终降落在大图里的位置赋值1。
*/
#include<iostream>
using namespace std;
int main(){
int board[16][11]; //用来存储俄罗斯方块游戏大方格
int block[5][5]; //用来存小方块4*4
int store[4][2]; //用来存小方块中为1元素的坐标(行与列)
int l;//初始小方块下落所在列数
int min=99999;//小方块每一块下落的最大距离的最小值
//初始化15*10大方格
for(int i=1;i<=15;i++)
for(int j=1;j<=10;j++)
cin>>board[i][j];
//输入4*4小方格
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
cin>>block[i][j];
cin>>l;
//存储小方块为1元素的行与列
int k=0;
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(block[i][j]==1)
{
store[k][0]=i;//小方块中的行数
store[k][1]=j+l-1;//在大方块中的列数
k++;
}
}
}
//确定小方块每一块下落的最大距离的最小值
for(int i=0;i<4;i++)
{
int a,b;
int count=0;
a=store[i][0];
b=store[i][1];
//下面用了两种循环结构while和for,注意for有个坑需要注意下,所以就采用while结构,把for循环方法注释了
/*
for(int j=a+1 ;j<=15;j++) //从第a+1行开始
{
if(board[j][b]==0)
{
count++;
}
//不加下面这两行则采用for()结构出错,因为当board[j][b]等于1时,for并没停止,可能遇到下面的0会接着使count增加
if(board[j][b]==1)
{ break;}
}
*/
while(board[a+1][b]==0){
count++;
a++;
}
if(min>count)
min=count;
}
//调整大方块最后位置
for(int i=0;i<4;i++)
{
int x,y;
x=store[i][0];
y=store[i][1];
board[x+min][y]=1;
}
//输出
for(int i=1;i<=15;i++)
{
for(int j=1;j<=10;j++)
{
cout<<board[i][j]<<" ";
}
cout<<endl;
}
return 0;
}