俄罗斯方块
题目
相信大家都玩过“俄罗斯方块”游戏吧,“俄罗斯方块”是一个有趣的电脑小游戏,现有一个有C列、行不受限定游戏平台,每一次下落的方块是下列的7个图形的一种:
在下落的过程中,游戏者可以作90、 180或270 度旋转,还可以左右移动,对于每一次方块落地,我们要求方块的每一部分都必须与地面(最底面或己落下的方块上表面)接触。
例如,有一个宽度为6列的平台,每一列的初始高度(已经占用的方格数)分别为2, 1, 1, 1, 0 和 1。编号为5的方块下落,有且仅有5种不同的落地方法:
现给出每一列的初始高度和下落方块的形状,请你编写一个程序,求出落地的方法总数,也就是落地后,地表面形成的不同的形状总数。
输入
第一行为二个整数C和P,1 ≤ C ≤ 100, 1 ≤ P ≤ 7,表示列数和下落方块的编号
第二行共有用一个空隔隔开的C个整数,每一个数字在 0 到 100,之间(包含0和100),表示每一列的初始高度
输出
输出为一个整数,表示落地的方法总数
输入样例1
6 5
2 1 1 1 0 1
输出样例1
5
输入样例2
5 1
0 0 0 0 0
输出样例2
7
输入样例3
9 4
4 3 5 4 6 5 7 6 6
输出样例3
1
思路
这道题模拟即可。
先打表一波,打出每个方块每种形态的下面的形状。然后枚举每一种形态,放在每一个位置上,看可不可以放,可以放答案就加一。
最后输出答案即可。
代码
#include<cstdio>
using namespace std;
int c,p,a[8][5][5],b[101],ans;
int main()
{
a[1][0][0]=2;//第一种方块
a[1][1][0]=1;
a[1][2][0]=4;
a[2][0][0]=1;//第二种方块
a[2][1][0]=2;
a[3][0][0]=2;//第三种方块
a[3][1][0]=3;a[3][1][1]=1;a[3][1][2]=1;
a[3][2][0]=2;a[3][2][2]=1;
a[4][0][0]=2;//第四种方块
a[4][1][0]=3;a[4][1][2]=1;a[4][1][3]=1;
a[4][2][0]=2;a[4][2][1]=1;
a[5][0][0]=4;//第五种方块
a[5][1][0]=3;
a[5][2][0]=2;a[5][2][1]=1;
a[5][3][0]=3;a[5][3][2]=1;
a[5][4][0]=2;a[5][4][2]=1;
a[6][0][0]=4;//第六种方块
a[6][1][0]=3;
a[6][2][0]=2;
a[6][3][0]=3;a[6][3][1]=1;
a[6][4][0]=2;a[6][4][2]=2;
a[7][0][0]=4;//第七种方块
a[7][1][0]=3;
a[7][2][0]=2;
a[7][3][0]=3;a[7][3][3]=1;
a[7][4][0]=2;a[7][4][1]=2;
scanf("%d%d",&c,&p);//读入
for (int i=1;i<=c;i++) scanf("%d",&b[i]);//读入
for (int i=1;i<=a[p][0][0];i++)//模拟此方块的每一种形态
for (int j=1;j<=c-a[p][i][0]+1;j++)//枚举次方块下落的每一个位置
{
int sum=a[p][i][1]+b[j];//赋初值
bool t=1;//初始化
for (int k=2;k<=a[p][i][0];k++)
if (a[p][i][k]+b[j+k-1]!=sum)//判断是否能放
{
t=0;//标记不能放
break;
}
if (t) ans++;//如果能放,方案数就加1
}
printf("%d",ans);//输出
return 0;
}