![NC20241 [SCOI2005]扫雷MINE](https://img2022.cnblogs.com/blog/2521724/202207/2521724-20220705195910943-1685443270.png)
相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。
万圣节到了 ,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字 表示和它8连通的格子里面雷的数目。
现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷, 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。
题目
- 原题地址:[SCOI2005]扫雷MINE
- 题目编号:NC20241
- 题目类型:枚举、递推
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
- 扫雷游戏背景,但只有两列,给出右边一列的每一个格子的位置,推测左边的雷有几种排列方案。
2.题目分析
mine[i-2] + mine[i-1] + mine[i] = num[i-1]
推出mine[i] = num[i-1] - mine[i-2] - mine[i-1]
- 在求出第一列每个格子是否有雷后进行合法性判断即可(为0或1,测试用例中不含此点)
- 以及最后两个格子的特判
mine[n-1]+mine[n-2]!=num[n-1]
3.题目代码
#include <bits/stdc++.h>
#define N 10000
using namespace std;
int n;
int mine[N];
int num[N];
int deduce()
{
for(int i=2;i<n;i++)
{
mine[i] = num[i-1] - mine[i-1] - mine[i-2];
if(mine[i]!=0&&mine[i]!=1)
return 0;
}
if(mine[n-1]+mine[n-2]!=num[n-1])
return 0;
return 1;
}
int main() {
cin >> n;
for(int i=0;i<n;i++)
cin >> num[i];
if(n==1)
{
cout << 1 << endl;
return 0;
}
int t = num[0];
if(t==0)
{
// mine[0] = mine[1] = 0;
cout << deduce() << endl;
} else if(t==1)
{
mine[0] = 1;
int tmp = deduce();
mine[0] = 0;
mine[1] = 1;
cout << tmp + deduce() << endl;
} else if(t==2)
{
mine[0] = mine[1] = 1;
cout << deduce() << endl;
}
}