hdu 1180 詭異的樓梯 搜尋
7 地圖如下:
這個題的難點就是梯子每隔一分鐘改變一次方向,需要判斷梯子每個時刻的方向,確定遇見梯子直接可以走嗎,題上說可以在任何非梯子的地方停留,這樣就可以在遇見梯子不能直接走的時候在原地等一分鐘
“登上樓梯並經過樓梯到達對面的整個過程只需要一分鐘”,如S.|T只需要兩分鐘,S到.一分鐘,梯子由|變為-,.到T一分鐘,所以可以當做梯子是不需要時間的
這個題比較水,有的資料是錯誤的就可以過,不過還是給辛苦的人一點資料吧,畢竟我也糾結了一天
5 5
**..T
**.*.
**|..
**.**
S..**
5 5
**..T
**.*.
**-..
**.**
S..**
5 5
.|.-T
-*-*|
.*.|.
-*-**
S|.**
5 5
S....
-|-|-
.....
-|-|-
....T
1 3
S-T
1 3
S|T
1 5
S|.|T
1 5
S-.-T
1 5
S|.-T
1 5
S-.|T
2 5
*.-.T
.S.|.
1 2
ST
2 4
-|.S
|T.-
1 5
S.-.T
3 5
.|*.T
.-.|.
S.-*.
3 4 T... *-*S *.|. 4 3 T** .|. .*- .S.
20 20
S.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.|
|.|.|.|.|.|.|.|.|.|.
.|.|.|.|.|.|.|.|.|.T
8 7 7 8 1 2 4 3 3 2 3 1 3 4 5 4 4 20
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; int t[4][2]= {1,0,-1,0,0,1,0,-1}; int n,m; int a1,b1,a2,b2; char a[22][22]; int v[22][22]; struct p { int x; int y; int step; friend bool operator <(p n1,p n2) { return n1.step>n2.step; } }; void bfs() { p tmp,now; priority_queue<p>Q; now.x=a1; now.y=b1; now.step=0; v[a1][b1]=1; Q.push(now); while(!Q.empty()) { now=Q.top(); Q.pop(); if(now.x==a2&&now.y==b2) { printf("%d\n",now.step); return; } for(int i=0; i<4; i++) { char c; tmp.x=now.x+t[i][0]; tmp.y=now.y+t[i][1]; tmp.step=now.step+1; if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&(a[tmp.x][tmp.y]=='|'||a[tmp.x][tmp.y]=='-')) //遇見梯子的情況 { if(tmp.step%2==0) { if(a[tmp.x][tmp.y]=='|') //判斷梯子的方向,切記不能直接改變a[][]陣列中梯子的方向,需要每次都用初始狀態的梯子方向確定此時的方向 //舉個例子,當tmp.step==2時,a陣列中梯子方向改變, //當tmp.step==4時,實際上方向和等於2是一樣的,如果直接按奇偶判斷還要改變梯子方向,就會造成梯子方向錯誤 c='-'; else c='|'; } else c=a[tmp.x][tmp.y]; if(c=='-'&&(i==3||i==2)||c=='|'&&(i==1||i==0)) { tmp.x=tmp.x+t[i][0]; tmp.y=tmp.y+t[i][1]; //梯子直接能走就直接到下一個點 if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&v[tmp.x][tmp.y]==0&&a[tmp.x][tmp.y]!='*') { v[tmp.x][tmp.y]=1; Q.push(tmp); } } else { tmp.x=now.x; //梯子直接不能走就在原地等一分鐘,步數加一,再次讓這個點入隊 tmp.y=now.y; Q.push(tmp); } } if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&(a[tmp.x][tmp.y]=='.'||a[tmp.x][tmp.y]=='T')&&v[tmp.x][tmp.y]==0) //不遇見梯子的情況 { Q.push(tmp); v[tmp.x][tmp.y]=1; } } } return; } int main() { while(~scanf("%d%d",&n,&m)) { memset(v,0,sizeof(v)); for(int i=0; i<n; i++) { scanf("%s",a[i]); for(int j=0; j<m; j++) { if(a[i][j]=='S') { a1=i; b1=j; } if(a[i][j]=='T') { a2=i; b2=j; } } } bfs(); } return 0; }