首页 > 代码库 > BZOJ 1088: [SCOI2005]扫雷Mine
BZOJ 1088: [SCOI2005]扫雷Mine
Description
相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了
,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字
表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图:
由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放
方案。
Input
第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)
Output
一个数,即第一列中雷的摆放方案数。
Sample Input
2
1 1
1 1
Sample Output
2
1 我们首先会想到直接枚举 2 棋盘只有n行2列 第二列已经给出 3 那么我们可以枚举第一列每个位置有雷无雷的情况 4 每个位置有两种情况 5 复杂度有O(2^n*n) !!! 6 7 那么 观察可以发现 我们已知第二列的雷 8 就可以用第二列的数字来判断 某个位置是否有雷 9 10 A a11 B b12 C c13 D d14 E e15 如果确定了A 那么可以推出B16 如果确定了B 根据a,b,A,B 可以推出C17 18 也就是当前两个位置确定后那么整列雷的位置都确定了——可证19 20 那么第一个位置有两种情况 那就是有雷和无雷 21 22 所有也就最多两种情况
1 #include<cstdio> 2 #include<iostream> 3 #define MAXN 10010 4 5 using namespace std; 6 7 int a[MAXN],n; 8 9 inline int check(int now) {//now戴表当前位置是否有雷10 int last=0;//last上一个位置是否有雷11 for(int i=1;i<n;i++) {12 int next=a[i]-last-now;//下一个位置是否有雷13 if(next<0||next>1) return 0;//当前情况合不合法14 last=now;15 now=next;16 }17 if(last+now!=a[n]) return 0;//最后一个格子合不合法18 else return 1;19 }20 21 int main() {22 scanf("%d",&n);23 for(int i=1;i<=n;i++) scanf("%d",&a[i]);24 printf("%d\n",check(0)+check(1));25 return 0;26 }
BZOJ 1088: [SCOI2005]扫雷Mine
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。