试题编号: | 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、定义2个二维数组a和t,分别存储方格图和板块。
2、定义数组ft[i],表示板图中第i列的方块的下边缘;定义数组fa[i],表示方格图中第i列的方块的上边缘。
3、遍历每行(实际为模拟方块下落过程),遍历方格图对应的那4列。若ft[i]+1==fa[i](即该方块的下边缘与方格图上的方块上边缘重合)或ft[i]==15(即该方块达到下边界)时,把板块中的方块对应放入方格图中。循环结束,打印输出。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int a[16][11];
int t[5][5];
int n;
//输入
for(int i=1;i<=15;i++)
for(int j=1;j<=10;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
scanf("%d",&t[i][j]);
scanf("%d",&n);
//记录图的上边缘和板块的下边缘
int fa[11]={0};//第i列的第几个为上边缘
for(int i=1;i<=15;i++){
for(int j=1;j<=10;j++){
if(a[i][j]==1&&fa[j]==0) fa[j]=i;
}
}
int ft[5]={0};//第i列的第几个为下边缘
for(int i=4;i>=1;i--){
for(int j=1;j<=4;j++){
if(t[i][j]==1&&ft[j]==0) ft[j]=i;
}
}
//挨边
int flag=0;
int f[5][5]={0};
for(int i=0;i<15;i++){
for(int j=n;j<n+4;j++){
//结束
int k=j-n+1;
int en=-2;
//printf("?\n");
if(ft[k]!=0) en=ft[k]+i;
if((en+1==fa[j])||(en==15)){
for(int ii=i+1,ti=1;ii<=15&&ti<=4;ii++,ti++){
for(int jj=n,tj=1;jj<n+4&&jj<=10&&tj<=4;jj++,tj++){
if(a[ii][jj]==0&&t[ti][tj]==1&&f[ti][tj]==0){
a[ii][jj]=t[ti][tj];
f[ti][tj]=1;
//printf("a[%d][%d]=t[%d][%d]=%d\n",ii,jj,ti,tj,a[ii][jj]);
}
}
}
flag=1;
break;
}
}
if(flag==1) break;
}
//打印
//printf("--------------\n");
for(int i=1;i<=15;i++){
for(int j=1;j<=10;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}