俄罗斯方块

匿名 (未验证) 提交于 2019-12-02 23:42:01
版权声明:欢迎各位巨佬评论! https://blog.csdn.net/weixin_43346722/article/details/91878109

俄罗斯方块

题目

相信大家都玩过“俄罗斯方块”游戏吧,“俄罗斯方块”是一个有趣的电脑小游戏,现有一个有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; } 
文章来源: https://blog.csdn.net/weixin_43346722/article/details/91878109
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!