[SCOI 2005]扫雷
只需要枚举第一个的状态,推出后继状态即可。
需要注意当 \(n=1\) 时的情况,以及当判断第一个及最后一个时的方法
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1e4+5;
int a[MAXN],b[MAXN];
int dfs(int s,int n)
{
if(n == 1)
{
return s == b[1];
}
for(int i=1,left=0;i<=n;i++)
{
if(i == 1)
{
a[i] = s;
if(a[i] > b[i]) return 0;
if(a[i]+1 < b[i]) return 0;
left = b[i] - a[i];
}
else if(i == n)
{
a[i] = left;
if(a[i-1]+a[i] != b[i]) return 0;
}
else
{
a[i] = left;
if(a[i-1]+a[i] > b[i]) return 0;
if(a[i-1]+a[i]+1 < b[i]) return 0;
left = b[i] - a[i-1] - a[i];
}
}
return 1;
}
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;i++) cin >> b[i];
int ans = 0;
ans += dfs(0,n);
ans += dfs(1,n);
cout << ans;
return 0;
}