P2327 [SCOI2005]扫雷
\(b[i]\)表示第\(i\)个行第一列是否有雷,即\(b[i]\)的值只能为\(0\)或\(1\)。
一旦第\(i-1\)行第一列的摆放情况确定,因为要满足\(8\)连通的格子里的数字限制,第\(i\)行第一列的摆放情况也随之确定。
递推式:
\[b[i] = a[i-1] - b[i-1] - b[i-2]
\]
\(a[i-1]\)表示第\(i-1\)行第二列的数字。
分别令\(b[1]=0\)和\(b[1]=1\)即可递推出\(b[2 \sim n]\)。
注意点
要判断\(b[n-1]+b[n]\)是否等于\(a[n]\)。
const int N=10010;
int a[N],b[N];
int n;
int ans;
bool check()
{
for (int i = 2; i <= n; i++)
{
b[i] = a[i-1] - b[i-1] - b[i-2];
if(b[i] < 0 || b[i] > 1) return false;
}
if (b[n-1] + b[n] != a[n]) return false;
return true;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
b[1] = 1; // 左边第一格有雷
if (check()) ans++;
b[1] = 0; // 左边第一格没雷
if (check()) ans++;
cout << ans << endl;
//system("pause");
return 0;
}