当您输入一个迷宫时,将沿途计算平方数X。如果图中可移动的平方数小于T,则您将永远无法到达T门的位置。2.如果可以在搜索中找到到终点的当前位置,则最短距离大于剩余步数,则无法到达。3使用BFS确定端点的当前位置是否可以实现,如果不能,则将其删除。这是R <)。使用4BFS计算当前位置所在的连接区域的面积。即使该区域小于要获取的距离,也无法达到。在这里,修剪是使用leftS()实现的。

下面显示代码实现ZOJ0ms / HDU0ms#includeiostream#includequeue#includecstdio#includememory。

Husingnamespacestd; constintSIZE = 8; inlineintabs(intn){returnn0?

n:-n;}inlineintdis(intx,inty){returnabs(x)+ abs(y);}structpos{intx,y;}; intN,M,T,sx,sy,dx,dy,dir[][2]={{–1,0},{1,0},{0,-1},{0,1}};魅力[大小?O][大小?O]; boolvis[大小?O][大小?O]; boolisR(intsx,intsy){queueposq; postmp ={sx,sy}; memset(vis,0,sizeofvis); q。

推送(tmp); vis[sx][sy]= 1;

q。

真空度()){tmp = q。

前(); q。

Pop(); for(inti = 0; i ++ i){inttx = tmp。

x +目录[i][0],ty = tmp。

和+ dir[i][1]; if(tx == dxty == dy)return1; if(tx0 || ty0 || tx = N || ty = M ||相对[tx][ty]|| m[tx][ty]== X)继续; postmp2 ={tx,ty}; q。

Push(tmp2); vis[tx][ty]= 1;}}return0;}intleftS(intsx,intsy){intstep = 0; queueposq; postmp ={sx,sy}; memset(vis,0,sizeofvis);q。

推送(tmp); vis[sx][sy]= 1;

q。

真空度()){tmp = q。

前(); q。

Pop(); for(inti = 0; i ++ i){inttx = tmp。

x +目录[i][0],ty = tmp。

和+ dir[i][1];是的(tx0 || ty0 || tx = N || ty = M ||相对[tx][ty]|| m[tx][ty]== X)继续;Postmp2 ={tx,ty}; q。

推送(tmp2); vis[tx][ty]= 1; ++步骤;}}returntep;}boolDFS(intsx,intsy,intcur){if(sx == dxsy == dy!

Cur)return1; intleft = cur-dis(dx-sx,dy-sy); if(left1 || left0 ||!

isR(sx,sy)|| leftS(sx,sy)cur)return0; for(inti = 0; i ++ i){inttx = sx + dir[i][0],ty = sy + dir[i][1];如果(tx0 || ty0 || tx = N || ty = M || m[tx][ty]== X)继续; m[tx][ty]= Xif(DFS(tx,ty,Cur-1))return1; m[tx][ty]=。

}return0;}intmain(){while(scanf(%d%d%d,N,M,T)N + M + T){for(inti = 0; i ++ i){scanf(%s,m[i]); for(intj = 0; j ++ j){if(m[i][j]== S){sx = i; sy = j;}elseif(m[i][j]== D){dx = i; dy = j;}}}m[sx][sy]= Xputs(DFS(sx,sy,T)?