正题
链接 需要纪中OJ账号
有7种方块
有n列,给出每列的方块高度,求一种方块所有方面都落地的方案数
输入输出(需要自取)
Input
第一行为二个整数C和P,1 ≤ C ≤ 100, 1 ≤ P ≤ 7,表示列数和下落方块的编号 第二行共有用一个空隔隔开的C个整数,每一个数字在 0 到 100,之间(包含0和100),表示每一列的初始高度
Output
输出为一个整数,表示落地的方法总数
Sample Input
- Input1
6 5
2 1 1 1 0 1 - Input2
5 1
0 0 0 0 0 - Input3
9 4
4 3 5 4 6 5 7 6 6
Sample Output
- Output1
5 - Output2
7 - Output3
1
解题思路
纯模拟能过。反正不需要考虑上方的方块,只要在最低层的方块落地就行了
代码(就不解释了)
#include<cstdio>
using namespace std;
int h[101],s,n,p;
int main()
{
scanf("%d%d",&n,&p);
for (int i=1;i<=n;i++)
scanf("%d",&h[i]);
if (p==1)
{
s+=n;
for (int i=1;i<=n-3;i++)
{
if (h[i]==h[i+1]&&h[i]==h[i+2]&&h[i]==h[i+3]) s++;
}
}
else if (p==2)
{
for (int i=1;i<n;i++)
{
if (h[i]==h[i+1])
s++;
}
}
else if (p==3)
{
for (int i=1;i<=n-2;i++)
{
if (h[i]==h[i+1]&&h[i]==h[i+2]-1)
s++;
}
for (int i=1;i<=n-1;i++)
{
if (h[i]-1==h[i+1])
s++;
}
}
else if (p==4)
{
for (int i=1;i<=n-2;i++)
{
if (h[i]-1==h[i+1]&&h[i+1]==h[i+2])
s++;
}
for (int i=1;i<=n-1;i++)
{
if (h[i]==h[i+1]-1)
s++;
}
}
else if(p==5)
{
for (int i=1;i<=n-2;i++)
{
if (h[i]==h[i+1]&&h[i+1]==h[i+2])
s++;
}
for (int i=1;i<=n-1;i++)
{
if (h[i]==h[i+1]-1)
s++;
}
for (int i=1;i<=n-1;i++)
{
if (h[i]-1==h[i+1])
s++;
}
for (int i=1;i<=n-2;i++)
{
if (h[i]==h[i+1]+1&&h[i+1]+1==h[i+2])
s++;
}
}
else if (p==6)
{
for (int i=1;i<n;i++)
{
if (h[i]==h[i+1])
s++;
}
for (int i=1;i<=n-2;i++)
{
if (h[i]==h[i+1]&&h[i+1]==h[i+2])
s++;
}
for (int i=1;i<=n-2;i++)
{
if (h[i]+1==h[i+1]&&h[i+1]==h[i+2])
s++;
}
for (int i=1;i<=n-1;i++)
{
if (h[i]==h[i+1]+2)
s++;
}
}
else if (p==7)
{
for (int i=1;i<n;i++)
{
if (h[i]==h[i+1])
s++;
}
for (int i=1;i<=n-2;i++)
{
if (h[i]==h[i+1]&&h[i+1]==h[i+2])
s++;
}
for (int i=1;i<=n-2;i++)
{
if (h[i]==h[i+1]&&h[i+1]==h[i+2]+1)
s++;
}
for (int i=1;i<=n-1;i++)
{
if (h[i]+2==h[i+1])
s++;
}
}
printf("%d",s);
}