相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了
,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字
表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图:
由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放
方案。
标签:游戏 pre 数字 open ret 连通 class std ace
一号坑
填坑……
相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了
,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字
表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图:
由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放
方案。
第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)
一个数,即第一列中雷的摆放方案数。
由题目易知当前两个确定了,后面也就确定了
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=1e4; 5 int n,ans; 6 int a[MAX],b[MAX]; 7 inline int read(){ 8 int an=0,x=1;char c=getchar(); 9 while (c<‘0‘ || c>‘9‘) {if (c==‘-‘) x=-1;c=getchar();} 10 while (c>=‘0‘ && c<=‘9‘) {an=(an<<3)+(an<<1)+c-‘0‘;c=getchar();} 11 return an*x; 12 } 13 bool check(){ 14 int i,j; 15 if (b[1]+b[2]!=a[1]) return false; 16 for (i=2;i<n;i++){ 17 if (b[i]+b[i-1]>a[i] || b[i]+b[i-1]<a[i]-1) return false; 18 b[i+1]=a[i]-b[i]-b[i-1]; 19 } 20 if (b[n-1]+b[n]!=a[n]) return false; 21 return true; 22 } 23 int main(){ 24 freopen ("mine.in","r",stdin);freopen ("mine.out","w",stdout); 25 int i,j; 26 n=read(); 27 for (i=1;i<=n;i++) a[i]=read(); 28 b[1]=0,b[2]=0; if (check()) ans++; 29 b[1]=0,b[2]=1; if (check()) ans++; 30 b[1]=1,b[2]=0; if (check()) ans++; 31 b[1]=1,b[2]=1; if (check()) ans++; 32 printf("%d",ans); 33 return 0; 34 }
BZOJ-1088: [SCOI2005]扫雷Mine ()
标签:游戏 pre 数字 open ret 连通 class std ace
原文地址:http://www.cnblogs.com/keximeiruguo/p/7748631.html