BZOJ 1088: [SCOI2005]扫雷Mine 枚举

枚举前两位,递推剩下的

1088: [SCOI2005]扫雷MineTime Limit:10 SecMemory Limit:162 MBSubmit:1832Solved:1090[Submit][Status][Discuss]Description

相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。

Input

第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)

Output

一个数,,即第一列中雷的摆放方案数。

Sample Input

21 1

Sample Output

2

HINTSource

/* ***********************************************Author:CKbossCreated Time :2015年04月28日 星期二 20时49分17秒File Name:BZOJ1088.cpp************************************************ */#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <cmath>#include <cstdlib>#include <vector>#include <queue>#include <set>#include <map>using namespace std;const int maxn=11000;int n,a[maxn],b[maxn],ans;int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",a+i);if(n==1){if(a[1]<=0) puts("1"); else puts("0");return 0;}if(n==2){if(a[1]==0&&a[2]==0) puts("1");else if((a[1]==1&&a[2]==0)||(a[1]==0&&a[2]==1)) puts("2");else if(a[1]==2&&a[2]==2) puts("1");else puts("0");return 0;}bool flag;if(a[1]==0){/// 0,0memset(b,0,sizeof(b));flag=true;int presum=0;for(int i=3;i<=n&&flag;i++){int next=a[i-1]-presum;if(next==1||next==0){b[i]=next;}else flag=false;presum-=b[i-2];presum+=next;}if(b[n]+b[n-1]!=a[n]) flag=false;if(flag) ans++;}if(a[1]==1){/// 0,1flag=true;int presum=1;memset(b,0,sizeof(b)); b[2]=1;for(int i=3;i<=n&&flag;i++){int next=a[i-1]-presum;if(next==1||next==0){b[i]=next;}else flag=false;presum-=b[i-2];presum+=next;}if(b[n]+b[n-1]!=a[n]) flag=false;if(flag) ans++;/// 1,0flag=true;presum=1;memset(b,0,sizeof(b)); b[1]=1;for(int i=3;i<=n&&flag;i++){int next=a[i-1]-presum;if(next==1||next==0){b[i]=next;}else flag=false;presum-=b[i-2];presum+=next;}if(b[n]+b[n-1]!=a[n]) flag=false;if(flag) ans++;}if(a[1]==2){// 1,1memset(b,0,sizeof(b));b[1]=b[2]=1;flag=true;int presum=2;for(int i=3;i<=n&&flag;i++){int next=a[i-1]-presum;if(next==1||next==0){b[i]=next;}else flag=false;presum-=b[i-2];presum+=next;}if(b[n]+b[n-1]!=a[n]) flag=false;if(flag) ans++;}printf("%d\n",ans);return 0;}

有的旅行是为了体验生活,感悟人生。

BZOJ 1088: [SCOI2005]扫雷Mine 枚举

相关文章:

你感兴趣的文章:

标签云: