题目描述
输入输出格式
输入格式:第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)
输出格式:一个数,即第一列中雷的摆放方案数。
输入输出样例
输入样例#1:
2 1 1
输出样例#1:
2
一开始蒙了,看了题解豁然开朗(套话)。
f[i][0] i和i+1都没有
f[i][1] i有和i+1没有
f[i][2] i没有和i+1有
f[i][3] i和i+1都有
雷的方案数。
之后就是模拟了。
记得赋初值。
#include<iostream>
#include<cstdio>
using namespace std;
const int N=10005;
int n,a[N],f[N][4]={{1,0,1,0}};
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n-1;i++)
switch(a[i])
{
case 0:
f[i][0]=f[i-1][0];
f[i][1]=0;
f[i][2]=0;
f[i][3]=0;
break;
case 1:
f[i][0]=f[i-1][1];
f[i][1]=f[i-1][2];
f[i][2]=f[i-1][0];
f[i][3]=0;
break;
case 2:
f[i][0]=0;
f[i][1]=f[i-1][3];
f[i][2]=f[i-1][1];
f[i][3]=f[i-1][2];
break;
case 3:
f[i][0]=0;
f[i][1]=0;
f[i][2]=0;
f[i][3]=f[i-1][3];
break;
default:
f[i][0]=0;
f[i][1]=0;
f[i][2]=0;
f[i][3]=0;
break;
}
switch(a[n])
{
case 0:
printf("%d\n",f[n-1][0]);
break;
case 1:
printf("%d\n",f[n-1][1]+f[n-1][2]);
break;
case 2:
printf("%d\n",f[n-1][3]);
break;
default:
printf("0\n");
}
return 0;
}