问题描述
试题编号: | 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 |
100分
模拟题,重要的步骤是创立coords数组,用来储存小方块的坐标。还有模拟小方块的下落过程
刚开始没有给a数组的最后一行 加一行1,得了八十。但是我还是不太清楚加这一行怎么能简化逻辑
#include <iostream>
#include<cmath>
#include<algorithm>
int a[16][11],b[5][5];
using namespace std;
struct node{
int row;
int col;
}coords[5];
bool check=false;
int main(){
int i,j;
int start;
for(i=0;i<15;i++){ //输入a数组:1到15行
for(j=0;j<10;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<4;i++){ //输入b数组,16到19行
for(j=0;j<4;j++){
scanf("%d",&b[i][j]);
}
}
scanf("%d",&start);
//将a数组再加一行全是1的
for(int j=0; j<10; j++)
a[15][j] = 1;
//储存小方块的坐标,注意要从下往上存
int k=0;
for(i=3;i>=0;i--)
for(j=0;j<=3;j++)
if(b[i][j]==1){
coords[k].row=i;
coords[k].col=j;
k++;
}
//模拟下落过程
int rowl=1;
for(;;){
for(int i=0;i<k;i++){
if(a[rowl+coords[i].row][start-1+coords[i].col]==1){ //因为输入的是第start列,是从第一列开始数的,所以要-1
check=true;
break;
}
}
if(check)
break;
rowl++;
}
//找到了小方块的位置,放到方格中,注意row要减一
rowl--;
for(int i=0;i<k;i++){
a[rowl+coords[i].row][start-1+coords[i].col]=1;
}
//输出结果
for(i=0;i<15;i++){
for(j=0;j<10;j++){
if(j!=0)
printf(" ");
printf("%d",a[i][j]);
}
printf("\n");
}
return 0;
}