CCF201604-2 俄罗斯方块
题目:
题目分析:
题目模拟游戏俄罗斯方块中的小方块下落的过程,需要我们计算小方块最后能落到的位置。
首先下落俄罗斯块(程序16-19行的输入)存入数组b[4][4],方格图存入a[16][10],存0表示空的,存1表示有该格子上有方块。另外,需要让数组a最后一行全为1,表示边界。
我的做法是把下落俄罗斯块看作一个整体在方格图中垂直下落,每下落一行便判断小方块与方格图的每一个交点是否同时为1(即小方块和方格图中都有格子),则不能下落,故返回上一行作为下落的最终位置,进行填图,具体做法:a[i+l][j]=max(a[i+l][j],b[l][k])。
代码如下:
#include<iostream>
using namespace std;
int a[16][10],b[4][4],n,flag;
int main(){
//输入数据
for(int i=0;i<15;i++)
for(int j=0;j<10;j++)
cin>>a[i][j];
for(int i=0;i<10;i++) a[15][i]=1; //第16行全为1,添加边界
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
cin>>b[i][j];
cin>>n;
//从0-16行,判断是否可以放下
for(int i=0;;i++){
for(int l=0;l<=3;l++) {
for(int j=n-1,k=0;j<n+3;k++,j++){ //k=j-n+1
//两个1相重,不可以放下,标记flag=1,跳出循环
if(a[i+l][j]==1&&b[l][k]==1){ flag=1; break; }
}
}
if(flag==1){ //此行不可以放下
i--; //返回上一行,填图
for(int l=0;l<=3;l++) {
for(int j=n-1,k=0;j<n+3;k++,j++){ //k=j-n+1
a[i+l][j]=max(a[i+l][j],b[l][k]);
}
}
break; //完成填图,跳出循环
}
}
//输出
for(int i=0;i<15;i++){
for(int j=0;j<10;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}