题目描述
输入输出格式
输入格式:
第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)
输出格式:
一个数,即第一列中雷的摆放方案数。
输入输出样例
输入样例#1:
2 1 1
输出样例#1:
2
思路:玩过扫雷的人都知道一旦第一个格子的雷定了,那么剩下的格子也都定了,故答案只有0,1,2三种,骗分数据为30,30,40,故我们只需要枚举第一个格子的情况,再根据第一个格子的情况往下推就可以,中间判断是否合法(不过话说这可是四川的省选题啊)。
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<ctime>
using namespace std;
const int MAXN=10010;
int a[MAXN],b[MAXN],c[MAXN];
int main()
{
int n,ans=0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
c[i]=b[i];
}
if (n==1)
{
if (b[1]==1)
{
cout<<1;
}
else
{
cout<<0;
}
return 0;
}
bool p=true;
a[1]=1;
for (int i=1;i<=n;i++)
{
if (a[i])
{
b[i]--;
b[i+1]--;
}
if (b[i])
{
a[i+1]=1;
b[i]--;
}
if (b[i])
{
p=false;
break;
}
}
if (p && !a[n+1])
{
ans++;
}
memset(a,0,sizeof(a));
a[1]=0;
p=true;
for (int i=1;i<=n;i++)
{
if (a[i])
{
c[i]--;
c[i+1]--;
}
if (c[i])
{
a[i+1]=1;
c[i]--;
}
if (c[i])
{
p=false;
break;
}
}
if (p && !a[n+1])
{
ans++;
}
cout<<ans;
return 0;
}
不得不说省选还是有省选的坑的,90分死在这么一个地方
if (p && !a[n+1])
按照我的处理方式第n+1个格子有雷也是合法的,这当然是不可能的。。。