扫雷(BZOJ1088) 题解

7 篇文章 0 订阅
5 篇文章 0 订阅
【问题描述】

    相信大家都玩过扫雷的游戏。那是在一个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.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值