扫雷(BZOJ1088) 题解
【问题描述】
相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。
【样例输入】
2
1 1
【样例输出】
2
【解题思路】
本题为SCOI2005的题,其实我们可以直接模拟就行了,如果对于第二列的第一个数,我们可以确定下来第一列的第一个和第二个数的情况,然后接下来的第一列的数就用第二列的这个数去减就好了,那么最终我们如果碰到了与之不相符的情况,就说明无法满足,可以证明,每种情况最多只有两种方案。
【代码实现】
1 var a,b:array[1..10000] of 0..3; 2 i,j,n,ans:longint; 3 function pd:longint; 4 var i:longint; 5 begin 6 for i:=2 to n-1 do 7 begin 8 if a[i]-b[i]-b[i-1]<0 then 9 exit(0) 10 else 11 b[i+1]:=a[i]-b[i]-b[i-1]; 12 end; 13 if b[n-1]+b[n]-a[n]<>0 then 14 exit(0); 15 exit(1); 16 end; 17 begin 18 readln(n); 19 for i:=1 to n do 20 read(a[i]); 21 case a[1] of 22 0:ans:=ans+pd; 23 1: 24 begin 25 b[1]:=1; 26 ans:=ans+pd; 27 fillchar(b,sizeof(b),0); 28 b[2]:=1; 29 ans:=ans+pd; 30 end; 31 2: 32 begin 33 b[1]:=1; 34 b[2]:=1; 35 ans:=ans+pd; 36 end; 37 end; 38 writeln(ans); 39 end.