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
直接模拟就好了。。答案只有可能是0.1.2,我们只需要根据第一个格子的种类来判断就好了。。。
如果是0,第一个和第二个都不是雷,
如果是1,分别判断第一个是雷和第二个是雷
如果是2,第一个和第二个都是雷
1 #include<iostream> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<algorithm> 7 #include<string> 8 #include<map> 9 #include<queue> 10 #include<vector> 11 #include<set> 12 #define inf 1000000000 13 #define maxn 10000+5 14 #define maxm 10000+5 15 #define eps 1e-10 16 #define ll long long 17 #define for0(i,n) for(int i=0;i<=(n);i++) 18 #define for1(i,n) for(int i=1;i<=(n);i++) 19 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 20 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 22 using namespace std; 23 int read(){ 24 int x=0,f=1;char ch=getchar(); 25 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 26 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 27 return x*f; 28 } 29 int a[maxn],w[maxn],n,ans=0,flag; 30 int main(){ 31 //freopen("input.txt","r",stdin); 32 //freopen("output.txt","w",stdout); 33 n=read(); 34 for1(i,n)a[i]=read(); 35 if(a[1]==0){ 36 for(int i=2;i<=n;i++){ 37 w[i+1]=a[i]-w[i]-w[i-1]; 38 if(w[i+1]!=0&&w[i+1]!=1){flag=1;break;} 39 } 40 if(!flag&&w[n]+w[n-1]==a[n])ans++; 41 flag=0; 42 } 43 else{ 44 if(a[1]==1){ 45 w[1]=1;w[2]=0; 46 for(int i=2;i<=n;i++){ 47 w[i+1]=a[i]-w[i]-w[i-1]; 48 if(w[i+1]!=0&&w[i+1]!=1){flag=1;break;} 49 } 50 if(!flag&&w[n]+w[n-1]==a[n])ans++; 51 flag=0; 52 w[1]=0;w[2]=1; 53 for(int i=2;i<=n;i++){ 54 w[i+1]=a[i]-w[i]-w[i-1]; 55 if(w[i+1]!=0&&w[i+1]!=1){flag=1;break;} 56 } 57 if(!flag&&w[n]+w[n-1]==a[n])ans++; 58 flag=0; 59 } 60 else{ 61 w[1]=w[2]=1; 62 for(int i=2;i<=n;i++){ 63 w[i+1]=a[i]-w[i]-w[i-1]; 64 if(w[i+1]!=0&&w[i+1]!=1){flag=1;break;} 65 } 66 if(!flag&&w[n]+w[n-1]==a[n])ans++; 67 } 68 } 69 printf("%d",ans); 70 return 0; 71 }