已知 Applese 在一個(gè)單位的時(shí)間內(nèi)可以朝四個(gè)方向行走一格,且開始處于水屬性,位于空地的道具拾取后只能在該處立即使用(或者不使用),且可以多次使用。求它走出迷宮需要的最少時(shí)間。 輸入描述: 第一行兩個(gè)正整數(shù) n, m 表示迷宮的大小。 接下來 n 行,每行長度為 m 的字符串。描述地圖。 其中 ‘S’ 表示起點(diǎn),‘T’ 表示終點(diǎn),’.’ 表示空地,‘w’表示巖漿,’~‘表示水池,’@’ 表示道具,’#'表示障礙。 保證地圖中的起點(diǎn)和終點(diǎn)只有一個(gè),道具都位于空地。
5 5
.w@..
.S#..
~w#..
.w..~
@w.~T
輸出:
18
備注: 1≤n,m≤100 Ac_code:
#include<stdio.h>#include<queue>constint maxn =105;
using namespace std;int n,m,sx,sy,ex,ey;struct point
{int x,y;int now, step;bool operator <(const point &p)const{return step > p.step;}};char mp[maxn][maxn];
bool vis[maxn][maxn][2];int dx[]={-1,1,0,0},dy[]={0,0,-1,1};intbfs(){point s;s.x = sx,s.y = sy;s.now =0,s.step =0;vis[s.x][s.y][s.now]= true;priority_queue<point>q;q.push(s);while(!q.empty()){point k = q.top();q.pop();if(k.x==ex&&k.y==ey){return k.step;}point t;for(int i =0; i <4; i++){t.x = k.x + dx[i];t.y = k.y + dy[i];t.now = k.now;t.step = k.step +1;if(t.x<0||t.x>=n||t.y<0||t.y>=m)continue;if(mp[t.x][t.y]=='#')continue;if(!vis[t.x][t.y][t.now]){if(mp[t.x][t.y]=='.'||mp[t.x][t.y]=='S'||mp[t.x][t.y]=='T'||mp[t.x][t.y]=='@'){vis[t.x][t.y][t.now]= true;q.push(t);}elseif((mp[t.x][t.y]=='~'&&k.now==0)||(mp[t.x][t.y]=='w'&&k.now==1)){vis[t.x][t.y][t.now]= true;q.push(t);}}if(mp[k.x][k.y]=='@'){t.now =!k.now;if(vis[t.x][t.y][t.now])continue;if((mp[t.x][t.y]=='~'&&t.now==1)||(mp[t.x][t.y]=='w'&&t.now==0))//這里要注意continue;t.step = k.step+2;vis[t.x][t.y][t.now]= true;q.push(t);}}}return-1;}intmain(){scanf("%d%d",&n,&m);for(int i =0; i < n; i++){scanf("%s",mp[i]);for(int j =0; j < m; j++){if(mp[i][j]=='S'){sx = i;sy = j;}elseif(mp[i][j]=='T'){ex = i;ey = j;}}}printf("%d\n",bfs());return0;}