poj 4115:鳴人和佐助
阿新 • • 發佈:2019-02-17
4115:鳴人和佐助
- 總時間限制:
- 1000ms
- 記憶體限制:
- 65536kB
- 描述
-
佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?
已知一張地圖(以二維矩陣的形式表示)以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每一個單位的查克拉可以打敗一個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動一個距離需要花費1個單位時間,打敗大蛇丸的手下不需要時間。如果鳴人查克拉消耗完了,則只可以走到沒有大蛇丸手下的位置,不可以再移動到有大蛇丸手下的位置。佐助在此期間不移動,大蛇丸的手下也不移動。請問,鳴人要追上佐助最少需要花費多少時間?
- 輸入
- 輸入的第一行包含三個整數:M,N,T。代表M行N列的地圖和鳴人初始的查克拉數量T。0 < M,N < 200,0 ≤ T < 10
後面是M行N列的地圖,其中@代表鳴人,+代表佐助。*代表通路,#代表大蛇丸的手下。 - 輸出
- 輸出包含一個整數R,代表鳴人追上佐助最少需要花費的時間。如果鳴人無法追上佐助,則輸出-1。
- 樣例輸入
-
樣例輸入14 4 1#@##**#####+****樣例輸入24 4 2#@##**#####+****
- 樣例輸出
-
樣例輸出16樣例輸出24
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; int n,m,t; char c[205][205]; int dx[4]={0,0,-1,1}; int dy[4]={1,-1,0,0}; struct Node { int x,y,step,T; Node(int xx,int yy,int ss,int tt) { x=xx;y=yy;step=ss;T=tt; } }; queue<Node>q; bool tag[205][205][10]; int main() { cin>>m>>n>>t; memset(tag,0,sizeof(tag)); int x,y; for(int i=0;i<m;++i) { for(int j=0;j<n;++j) { cin>>c[i][j]; if(c[i][j]=='@') { x=i;y=j; tag[i][j][t]=true; } } } q.push(Node(x,y,0,t)); while(!q.empty()) { Node tmp=q.front(); q.pop(); int xx=tmp.x,yy=tmp.y,ss=tmp.step,tt=tmp.T; if(c[xx][yy]=='+') { cout<<ss<<endl; return 0; } for(int i=0;i<4;++i) { int xxx=xx+dx[i]; int yyy=yy+dy[i]; if((c[xxx][yyy]=='*'||c[xxx][yyy]=='+')&&!tag[xxx][yyy][tt]) { tag[xxx][yyy][tt]=true; q.push(Node(xxx,yyy,ss+1,tt)); } else if(c[xxx][yyy]=='#'&&tt-1>=0&&!tag[xxx][yyy][tt-1]) { tag[xxx][yyy][tt]=true; q.push(Node(xxx,yyy,ss+1,tt-1)); } } } cout<<-1<<endl; return 0; }