基本思路就是深搜啦~
将二位压缩为一维以及集合操作是这题解的亮点
注意特判终点是障碍的情况
```pascal
var
n,m,t,i,x,y,s,f,ans:longint;
a,path:set of byte;
function getpos(x,y:longint):byte;inline;
begin
exit((x-1)*m+y)
end;
function getup(p:byte):byte;inline;
begin
exit(p-m)
end;
function getdown(p:byte):byte;inline;
begin
exit(p+m)
end;
function getleft(p:byte):byte;inline;
begin
exit(p-1)
end;
function getright(p:byte):byte;inline;
begin
exit(p+1)
end;
function isup(p:byte):boolean;inline;
begin
exit(p<=m)
end;
function isdown(p:byte):boolean;inline;
begin
exit(p>m*(n-1))
end;
function isleft(p:byte):boolean;inline;
begin
exit(p mod m=1)
end;
function isright(p:byte):boolean;inline;
begin
exit(p mod m=0)
end;
procedure dfs(p:longint);
begin
if (p=f) and not (p in a) then begin
inc(ans);
exit
end;
if not (p in path+a) then begin
path:=path+[p]
end
else begin
exit
end;
if not isup(p) then begin
dfs(getup(p))
end;
if not isdown(p) then begin
dfs(getdown(p))
end;
if not isleft(p) then begin
dfs(getleft(p))
end;
if not isright(p) then begin
dfs(getright(p))
end;
path:=path-[p]
end;
begin
readln(n,m,t);
read(x,y);
s:=getpos(x,y);
readln(x,y);
f:=getpos(x,y);
a:=[];
for i:=1 to t do begin
readln(x,y);
a:=a+[getpos(x,y)]
end;
ans:=0;
dfs(s);
writeln(ans)
end.
```