1. 程式人生 > >掃雷(BZOJ1088) 題解

掃雷(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.