题解 P1605 【迷宫】

skylee

2016-10-30 10:55:00

Solution

基本思路就是深搜啦~ 将二位压缩为一维以及集合操作是这题解的亮点 注意特判终点是障碍的情况 ```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. ```