题目:现在有n*2的扫雷棋盘(当一个位置没有雷的时候将会出现对应周围8个位置的雷数),输入N,及第二列N个数(第二列全部都不是雷),问:有几种方案能使埋第一列雷的方式成立
思路:设雷为mine[],有雷时数值为0,没雷时数值为1,给出的数为a[],找到递推关系mine[i-1]+mine[i]+mine[i+1]=a[i],当i=0的时候mine[0]+mine[1]=a[0]这样的话确定第一个位置有没有雷的时候就能确定第二个雷的情况,确定前两个雷的情况后就能确定全部雷的情况了。接下来就枚举直接看递推后的雷数值是否符合0或1,不符合就说明该方案不成立就行了
代码:
#include <iostream> using namespace std; int a[10010]; int mine[10010]= {0}; int main() { int n; cin>>n; int ans=0; for(int i=0; i<n; i++)cin>>a[i]; for(int k=0; k<2; k++)//第一个位置只有填雷与不填雷两种情况 { int i=0; mine[0]=k; mine[1]=a[0]-mine[0]; if(mine[1]<0||mine[1]>1)continue;//开头特判 int ok=1; for(i=1; i<n-1; i++) { mine[i+1]=a[i]-mine[i]-mine[i-1]; if(mine[i+1]<0||mine[i+1]>1)ok=0; } if(mine[i]+mine[i-1]!=a[i])ok=0;//结尾记得也要特判 if(ok){ ans++; } } cout<<ans; return 0; }