【递推】BZOJ 1088: [SCOI2005]扫雷Mine
1088: [SCOI2005]扫雷Mine
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2275 Solved: 1328
[Submit][Status][Discuss]
Description
相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。
Input
第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)
Output
一个数,即第一列中雷的摆放方案数。
Sample Input
2
1 1
1 1
Sample Output
2
世纪大水题。。
然而我这个大蒟蒻还是偷看了一发题解。。
只要确(mei)定(ju)第一个位置有没有雷就能知道推出整个序列
然后就是判定问题了。。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 6 using namespace std; 7 8 inline int in() 9 { 10 int x=0;char ch=getchar(); 11 while(ch<'0'||ch>'9')ch=getchar(); 12 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); 13 return x; 14 } 15 16 int a[10001],n; 17 18 int jud(int f1) 19 { 20 int f2=a[1]-f1; 21 for(int i=2;i<n;i++) 22 { 23 int f3=a[i]-f1-f2; 24 if(f3==0||f3==1) 25 { 26 f1=f2; 27 f2=f3; 28 } 29 else return 0; 30 } 31 if(f1+f2!=a[n])return 0; 32 else return 1; 33 } 34 35 int main() 36 { 37 int ans=0; 38 n=in(); 39 for(int i=1;i<=n;i++)a[i]=in(); 40 if(n==1&&(a[1]==0||a[1]==1)){printf("1");return 0;} 41 if(a[1]==0)ans+=jud(0); 42 else ans+=jud(0)+jud(1); 43 printf("%d",ans); 44 return 0; 45 }
vfk:
gg。。