(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;
}