POJ-拯救行动
公主被恶人抓走,被关押在牢房的某个地方。牢房用N*M (N, M <= 200)的矩阵来表示。矩阵中的每项可以代表道路(@)、墙壁(#)、和守卫(x)。
英勇的骑士(r)决定孤身一人去拯救公主(a)。我们假设拯救成功的表示是“骑士到达了公主所在的位置”。由于在通往公主所在位置的道路中可能遇到守卫,骑士一旦遇到守卫,必须杀死守卫才能继续前进。
现假设骑士可以向上、下、左、右四个方向移动,每移动一个位置需要1个单位时间,杀死一个守卫需要花费额外的1个单位时间。同时假设骑士足够强壮,有能力杀死所有的守卫。
给定牢房矩阵,公主、骑士和守卫在矩阵中的位置,请你计算拯救行动成功需要花费最短时间。
Input第一行为一个整数S,表示输入的数据的组数(多组输入)
随后有S组数据,每组数据按如下格式输入
1、两个整数代表N和M, (N, M <= 200).
2、随后N行,每行有M个字符。"@"代表道路,"a"代表公主,"r"代表骑士,"x"代表守卫, "#"代表墙壁。Output如果拯救行动成功,输出一个整数,表示行动的最短时间。
如果不可能成功,输出"Impossible"
#include<bits/stdc++.h> using namespace std; bool vis[205][205]; char meme[205][205]; int fx[4][2]={0,1,1,0,0,-1,-1,0}; struct yuu{ int time; int x,y; friend bool operator<(yuu a,yuu b){ return a.time>b.time; } }; priority_queue<yuu> op; int a,b; int rx,ry,px,py; int MIN; void bfs(yuu m) { if(m.x<=0||m.y<=0||m.x>a||m.y>b||meme[m.x][m.y]=='#'||vis[m.x][m.y]) return; if(m.x==px&&m.y==py) { if(m.time<MIN) MIN=m.time; return; } if(meme[m.x][m.y]=='x') m.time+=1; vis[m.x][m.y]=true; op.push(m); } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int sum;cin>>sum; while(sum--) { memset(vis,false,sizeof(vis)); MIN=99999999; cin>>a>>b; for(int i=1;i<=a;i++) for(int j=1;j<=b;j++) { cin>>meme[i][j]; if(meme[i][j]=='r') { rx=i,ry=j; } if(meme[i][j]=='a') { px=i,py=j; } } yuu beg;beg.time=0,beg.x=rx,beg.y=ry; op.push(beg); vis[rx][ry]=true; while(!op.empty()) { beg=op.top(); op.pop(); for(int i=0;i<4;i++) { yuu k;k.time=beg.time+1,k.x=beg.x+fx[i][0],k.y=beg.y+fx[i][1]; bfs(k); } } if(MIN!=99999999) cout<<MIN<<endl; else cout<<"Impossible"<<endl; } return 0; }
活用优先队列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义