俄罗斯方块
题目大意:
在俄罗斯方块中,放一块方块进一个图中,问刚好和上的可能性有多少种
原题:
题目描述
相信大家都玩过“俄罗斯方块”游戏吧,“俄罗斯方块”是一个有趣的电脑小游戏,现有一个有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
输入样例#2
5 1
0 0 0 0 0
输入样例#3
9 4
4 3 5 4 6 5 7 6 6
输出样例#1
5
输出样例#1
7
输出样例#1
1
解题思路:
先打一波表先(手残党),然后模拟每一个位置,看是否合得上
代码:
#include<cstdio>
using namespace std;
int n,c,p,sum,ans,b[105],a[10][10][10];
int main()
{a[1][0][0]=2;//两种方向a[1][1][0]=1,a[1][1][1]=0;//每个格子的高度a[1][2][0]=4,a[1][2][1]=0,a[1][2][2]=0,a[1][2][3]=0,a[1][2][4]=0;a[2][0][0]=1;a[2][1][0]=2,a[2][1][1]=0,a[2][1][2]=0;a[3][0][0]=2;a[3][1][0]=3,a[3][1][1]=1,a[3][1][2]=1,a[3][1][3]=0;//1是要往下1格,到时直接相加看是否相同就知道是否符合了a[3][2][0]=2,a[3][2][1]=0,a[3][2][2]=1;a[4][0][0]=2;a[4][1][0]=3,a[4][1][1]=0,a[4][1][2]=1,a[4][1][3]=1;a[4][2][0]=2,a[4][2][1]=1,a[4][2][2]=0;a[5][0][0]=4;a[5][1][0]=3,a[5][1][1]=0,a[5][1][2]=0,a[5][1][3]=0;a[5][2][0]=2,a[5][2][1]=1,a[5][2][2]=0;a[5][3][0]=3,a[5][3][1]=0,a[5][3][2]=1,a[5][3][3]=0;a[5][4][0]=2,a[5][4][1]=0,a[5][4][2]=1;a[6][0][0]=4;a[6][1][0]=3,a[6][1][1]=0,a[6][1][2]=0,a[6][1][3]=0;a[6][2][0]=2,a[6][2][1]=0,a[6][2][2]=0;a[6][3][0]=3,a[6][3][1]=1,a[6][3][2]=0,a[6][3][3]=0;a[6][4][0]=2,a[6][4][1]=0,a[6][4][2]=2;a[7][0][0]=4;a[7][1][0]=3,a[7][1][1]=0,a[7][1][2]=0,a[7][1][3]=0;a[7][2][0]=2,a[7][2][1]=0,a[7][2][2]=0;a[7][3][0]=3,a[7][3][1]=0,a[7][3][2]=0,a[7][3][3]=1;a[7][4][0]=2,a[7][4][1]=2,a[7][4][2]=0;scanf("%d %d",&n,&c);for (int i=1;i<=n;++i)scanf("%d",&b[i]);for (int i=1;i<=a[c][0][0];++i)//模拟每一种形态for (int j=1;j<=n-a[c][i][0]+1;++j)//每一个位置{sum=a[c][i][1]+b[j];//初值p=1;for (int k=2;k<=a[c][i][0];++k)if (a[c][i][k]+b[j+k-1]!=sum) p=0;//判断是否相同if (p) ans++;}printf("%d",ans);
}