天天看點

上學路線 (Standard IO)

題意/Description:

       你所在城市的街道好像一個棋盤,有a條南北方向的街道,和b條東西方向的街道。

       南北方向的a條街道從西到東依次編号為1到a,而東西方向的b條街道從南到北依次編号為1到b,南北方向的街道i和東西方向的街道j的交點記為(I,j)。

       你住在(1,1)處,而學校在(a,b)處,你騎自行車去上學,自行車隻能沿着街道走,而且為了縮短時間隻允許沿着向東和北的方向行駛。

       現在有N個交叉路口在施工(X1,Y1)、(X2,Y2),,,(Xn,Yn),這些路口是不能通車的。

       問你上學一共有多少走法?

讀入/Input:

       第一行包含兩個整數a和b,并且滿足1<=a,b<=16。

       第二行包含一個整數N,表示有N個路口在維修(1<=N<=40)

       接下來N行,每行兩個整數X_i,Y_i,描述路口的位置。

輸出/Output:

       輸出一個整數表示從(1,1)到(a,b)的行車路線總數。

題解/solution:

       赤裸裸的搜尋。

代碼/Code:

var
  n,m,ans:longint;
  a:array [0..20,0..20] of boolean;
  dx,dy:array [1..2] of longint;
procedure init;
var
  t,i,x,y:longint;
begin
  fillchar(a,sizeof(a),true);
  readln(m,n);
  readln(t);
  for i:=1 to t do
    begin
      readln(y,x);
      a[n-x+1,y]:=false;
    end;
  ans:=0;
  dx[1]:=-1; dy[1]:=0;
  dx[2]:=0; dy[2]:=1;
end;

procedure main(x,y:longint);
var
  i:longint;
begin
  if (x<1) or (x>n) or (y<1) or (y>m) or (not a[x,y]) then exit;
  if (x=1) and (y=m) then
    begin
      inc(ans);
      exit;
    end;
  a[x,y]:=false;
  for i:=1 to 2 do
    main(x+dx[i],y+dy[i]);
  a[x,y]:=true;
end;

begin
  init;
  main(n,1);
  write(ans);
end.