5 5 **..T **.*. ..|.. .*.*. S....
7 HintHint 地圖如下:
開始wa了很多次,原來是題意沒搞清,還以為只有例子中' |' 這一種樓梯的符號,原來還有’-‘!
要點: 優先隊列的構造,判斷條件的抽取,特殊條件(等待一秒在前進)
優先隊列,使得當前時間小的先出隊列,
所以當前坐標的結構體需要這樣寫
struct node{ int x,y,step; //兩種方式重載小於號 /* friend bool operator <(node a,node b){ return a.step>b.step; } */ bool operator <(const node &a)const{ return step>a.step;//步數小的先出隊列 } }init;因為使用了優先隊列,所以不再用傳統的vis標記是否走過,對於一個已經走過的位置,如果當前step小於之前的step,則可以重復走,
所以用statue[][]這個數組儲存走過位置的當前步數;
判斷條件很多,我們把它抽取到函數judge
bool judge(node no){ //如果超出邊界,或者該位置是牆,或者當前步數大於之前步數,返回false if(no.x<0||no.x>=n||no.y<0||no.y>=m||map[no.x][no.y]=='*'||(statue[no.x][no.y]&&no.step>=statue[no.x][no.y])) return false; return true; }如果遇到樓梯方向與前進方向不一致,可以等待一秒,再前進
將這個情況與 一致時的情況放在一起,只是步數不同
【源代碼】
#include#include #include using namespace std; int n,m; const int maxn = 21; int stx,sty,gx,gy; char map[maxn][maxn]; bool vis[maxn][maxn]; int statue[maxn][maxn]; int dx[4]={0,0,1,-1}; int dy[4]={-1,1,0,0}; struct node{ int x,y,step; /* friend bool operator <(node a,node b){ return a.step>b.step; } */ bool operator <(const node &a)const{ return step>a.step;//步數小的先出隊列 } }init; bool judge(node no){ //如果超出邊界,或者該位置是牆,或者當前步數大於之前步數,返回false if(no.x<0||no.x>=n||no.y<0||no.y>=m||map[no.x][no.y]=='*'||(statue[no.x][no.y]&&no.step>=statue[no.x][no.y])) return false; return true; } int bfs(){ init.x=stx;init.y=sty;init.step=0; statue[init.x][init.y]=1; priority_queue pq; while(!pq.empty()) pq.pop(); pq.push(init); while(!pq.empty()){ node past=pq.top(); node now; pq.pop(); for(int i=0;i<4;i++){ now.x=past.x+dx[i]; now.y=past.y+dy[i]; now.step=past.step+1; if(!judge(now)) continue; if(map[now.x][now.y]=='|'){ if(now.x==past.x&&(past.step & 1)==0) //當橫著走,且 | 不變 now.step++; if(now.y==past.y&&(past.step & 1)==1)//當 豎著走 且 |變 { now.step++; } now.x+=dx[i]; now.y+=dy[i]; } else if(map[now.x][now.y]=='-'){ if(now.x==past.x&&(past.step & 1)==1) //當橫著走,且 -變 now.step++; if(now.y==past.y&&(past.step & 1)==0)//當豎著走 且-不變 now.step++; now.x+=dx[i]; now.y+=dy[i]; } if(!judge(now)) continue; if(map[now.x][now.y]=='T') return now.step; statue[now.x][now.y]=now.step; pq.push(now); } } return 0; } int main(){ while(cin>>n>>m){ for(int i=0;i >map[i][j]; if(map[i][j]=='S') stx=i,sty=j; if(map[i][j]=='T') gx=i,gy=j; } memset(statue,0,sizeof(statue)); int ans=bfs(); cout<