上学路线 (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.