相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案 。
1<= N <= 10000
2
1 1
2
题解:
输入的n个数为a[1],a[2]..a[n],表示的是周围的雷数。假设第i行的雷数为b[i],那么得到递推式:b[i]=a[i-1]-b[i-1]-b[i-2]。
意思是当b[i-1]和b[i-2]得出结果后,b[i]的值是固定的,唯一不确定的是b[1],可以使b[1]的值为0,1各做一次递推。若任意b[i]的值为0或1,则答案加1。到此问题解决。
(答案只能为0..2)
#include <cstdio>
using namespace std;
const int maxn = 10010;
int a[maxn], ans[maxn];
int main()
{
int n,res=0;
bool ok=false;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (ans[1] = 0; ans[1] <= 1; ans[1]++) {
ans[2] = a[1] - ans[1]; ok = false;
for (int i = 3; i <= n; i++) {
ans[i] = a[i-1] - ans[i-1] - ans[i-2];
if (ans[i] < 0) {
ok = true; break;
}
}
if (ans[n] == a[n] - ans[n-1] && !ok) res++;
}
printf("%d\n", res);
return 0;
}