传送门
题目描述
输入输出格式
输入格式:
第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)
输出格式:
一个数,即第一列中雷的摆放方案数。
输入输出样例
输出样例#1:
2
思路:
可根据左边第一个格子和右边第一个格子的方案(放or不放)推出左边第二个格子的方案,以此类推,最终可以推出左边n个格子的方案。因此,只要知道左边第一个格子的方案,则整列的方案就是唯一的。
我们可以把第一个格子不放雷和第一个格子放雷的方案分别模拟,用a[i]表示右列的数字,用put[i]表示第i格的雷数,得出的答案只能是0 or 1 or 2。
注意一些不合法的情况:
1.当i=1时,put[1]+1<a[1] 说明第2格再放雷也不合法
2.当1<i<n时,put[i-1]+put[i]>a[i] 说明放的雷太多了 方案不合法
2.当1<i<n时,put[i-1]+put[i]+1<a[i] 说明放的雷太少了 方案不合法
4.当i=n时,put[n-1]+put[n]<a[n] 说明第n格放雷不合法
AC Code:
#include<cstdio> #include<cstring> using namespace std; int a[10010]; int put[10010]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int ans=0; put[1]=1; bool flag=0; for(int i=1;i<=n;i++) { if(put[i-1]+put[i]==a[i]) put[i+1]=0; else if((put[i-1]+put[i]>a[i])||(i==1&&put[i]+1<a[i])||(i==n&&put[i-1]+put[i]<a[i])||(put[i-1]+put[i]+1<a[i])) { flag=1;break; } else if(i!=n&&put[i-1]+put[i]+1==a[i]) put[i+1]=1; } if(!flag) ans++; memset(put,0,sizeof(put)); flag=0; for(int i=1;i<=n;i++) { if(put[i-1]+put[i]==a[i]) put[i+1]=0; else if((put[i-1]+put[i]>a[i])||(i==1&&put[i]+1<a[i])||(i==n&&put[i-1]+put[i]<a[i])||(put[i-1]+put[i]+1<a[i])) { flag=1;break; } else if(i!=n&&put[i-1]+put[i]+1==a[i]) put[i+1]=1; } if(!flag) ans++; printf("%d",ans); return 0; }