4115:鸣人和佐助
总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?
已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也不移动。请问,鸣人要追上佐助最少需要花费多少时间?
- 输入
- 输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10
后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。 - 输出
- 输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。
- 样例输入
-
样例输入1 4 4 1 #@## **## ###+ **** 样例输入2 4 4 2 #@## **## ###+ ****
- 样例输出
-
样例输出1 6 样例输出2 4
刚开始,没有意识到visit应该是三维的。
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct Node { 4 int r, c, step, k; 5 Node(int rr,int cc,int ss,int kk):r(rr),c(cc),step(ss),k(kk) {} 6 Node() {} 7 }; 8 int dr[4]= {1,-1,0,0}; 9 int dc[4]= {0,0,1,-1}; 10 int M,N,T; 11 char a[205][205]; 12 int visit[205][205][16]; 13 Node start,goal; 14 queue <Node> q; 15 int main() { 16 cin>>M>>N>>T; 17 memset(visit,1,sizeof(visit)); 18 for(int i=1; i<=M; i++) { 19 for(int j=1; j<=N; j++) { 20 cin>>a[i][j]; 21 if(a[i][j]=='@') { 22 start=Node(i,j,0,T); 23 } 24 if(a[i][j]=='+') { 25 goal=Node(i,j,-1,-1); 26 a[i][j]='*'; 27 } 28 for(int t=0; t<=T; t++) { 29 visit[i][j][t]=0; 30 } 31 } 32 } 33 while(!q.empty())q.pop(); 34 visit[start.r][start.c][T]=1; 35 q.push(start); 36 while(!q.empty()) { 37 Node p=q.front(); 38 q.pop(); 39 if(p.r==goal.r&&p.c==goal.c) { 40 cout<<p.step<<endl; 41 return 0; 42 } else { 43 for(int i=0; i<4; i++) { 44 int rr=p.r+dr[i]; 45 int cc=p.c+dc[i]; 46 if(!visit[rr][cc][p.k]&&p.k>0&&a[rr][cc]=='#') { 47 visit[rr][cc][p.k]=1; 48 q.push(Node(rr,cc,p.step+1,p.k-1)); 49 } 50 if(!visit[rr][cc][p.k]&&a[rr][cc]=='*') { 51 visit[rr][cc][p.k]=1; 52 q.push(Node(rr,cc,p.step+1,p.k)); 53 } 54 } 55 } 56 57 } 58 if(q.empty())cout<<-1<<endl; 59 60 return 0; 61 }
越努力越幸运