其他分享
首页 > 其他分享> > 俄罗斯方块

俄罗斯方块

作者:互联网

俄罗斯方块

题目

相信大家都玩过“俄罗斯方块”游戏吧,“俄罗斯方块”是一个有趣的电脑小游戏,现有一个有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;
}

标签:输出,落地,样例,下落,100,俄罗斯,方块
来源: https://blog.csdn.net/weixin_43346722/article/details/91878109