#include<iostream>//乱搞,代码变得很长
using
namespace
std;
int
a[12001]={0},n,sum=0;
bool
bomb[12001];
int
can(
int
x)
{
int
zt1=1,zt2;
if
(x>1)
{
int
num1=0;
if
(x>=3)
if
(bomb[x-2])num1++;
if
(bomb[x-1])num1++;
if
(num1+1<a[x-1]||num1>a[x-1])
return
3;
if
(num1==a[x-1]-1)zt1=2;
if
(num1==a[x-1])zt1=0;
}
int
num2=0,test2=0;
if
(x>=2)
if
(bomb[x-1])num2++;
test2=num2;
if
(zt1!=0)test2++;
if
(x+1<=n)test2++;
if
(test2<a[x])
return
3;
else
if
(num2==a[x])zt2=0;
else
if
(num2==a[x]-1)zt2=1;
else
if
(a[x]-num2>=2)zt2=2;
if
(zt1==0&&zt2==2)
return
3;
if
(zt1==2&&zt1==0)
return
3;
if
(zt1==0||zt2==0)
return
0;
if
(zt1==2||zt2==2)
return
2;
if
(zt1==1&&zt2==1)
return
1;
return
3;
}
void
search(
int
x)
{
if
(x==n+1){sum++;
return
;}
else
{
int
test=can(x);
if
(test==0)search(x+1);
else
if
(test==1)
{
bomb[x]=
true
;
search(x+1);
bomb[x]=
false
;
search(x+1);
}
else
if
(test==2)
{
bomb[x]=
true
;
search(x+1);
}
return
;
}
}
int
main()
{
cin>>n;
for
(
int
i=1;i<=n;i++)
{
cin>>a[i];
if
(a[i]>=4)
{
cout<<0<<endl;
return
0;
}
if
(a[i]==3)
if
(i==1||i==n)
{
cout<<0<<endl;
return
0;
}
}
for
(
int
i=0;i<=12000;i++)
bomb[i]=
false
;
search(1);
cout<<sum<<endl;
return
0;
}
#include<iostream>//短版 #include<cstring> #include<cstdio> using namespace std; int n,ans; int a[10001],f[10001]; bool jud() { for(int i=2;i<=n;i++) { f[i+1]=a[i]-f[i]-f[i-1]; if(f[i+1]<0)return 0; } if(a[n]-f[n-1]-f[n]!=0)return 0; return 1; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i]); if(a[1]==0)ans+=jud(); else if(a[1]==1) { f[1]=1;ans+=jud(); memset(f,0,sizeof(f)); f[2]=1;ans+=jud(); } else {f[1]=f[2]=1;ans+=jud();} printf("%d",ans); return 0; }
【bzoj1088】[SCOI2005]扫雷Mine(9018p1289)
最新推荐文章于 2022-04-17 14:45:05 发布