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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章