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



原文地址:https://www.cnblogs.com/zyx-crying/p/9319632.html