两列的,所以第一列前两个格子确定了,后面的就都确定了,所以只要枚举前两个格子的状态,再模拟是否可行就可以了
code:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[2][11000],n,k;
void dfs( int x )
{
if( x>n )return;
a[0][x+1] = a[1][x] - a[0][x-1] - a[0][x];
if( a[0][x+1] < 0 || a[0][x+1] > 1 || ( x==n && a[0][x+1]==1 ) )
{
k--;return;
}
dfs( x+1 );
}
int main()
{
int i,j;
scanf("%d",&n); k = 0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[1][i]);
if( a[1][i]>3 )
{
printf("0\n");
return 0;
}
}
if( a[1][1] == 3 )
{
printf("0\n");
return 0;
}
if( a[1][1] == 0 )
{
k++;
a[0][1]=a[0][2]=0; dfs(2);
}
else if( a[1][1] == 2 )
{
k++;
a[0][1]=a[0][2]=1; dfs(2);
}
else
{
k++;
a[0][1]=1;a[0][2]=0; dfs(2);
k++;
a[0][1]=0;a[0][2]=1; dfs(2);
}
printf( "%d\n",k );
return 0;
}