題意/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.