百练 4116 拯救行动
2016-07-21 21:40
399 查看
4116:拯救行动
#include<iostream> #include<cstdio> #include<queue> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int maxn=200+5; int R,C,vis[maxn][maxn]; char G[maxn][maxn]; int r0,c0,r1,c1; struct Point{ int x,y,step; bool operator < (const Point& p) const { return step>p.step; } Point(int x,int y,int s): x(x),y(y),step(s){} }; bool inside(int x,int y) { return x>=0&&x<R&&y>=0&&y<C; } int bfs(int i,int j) { priority_queue<Point> Q; Q.push(Point(i,j,0)); vis[i][j]=1; while(!Q.empty()) { int x=Q.top().x,y=Q.top().y,step=Q.top().step;Q.pop(); if(x==r1&&y==c1) return step; for(int dx=-1;dx<=1;dx++) for(int dy=-1;dy<=1;dy++) { if((dx&&dy)||(!dx&&!dy)) continue; int nx=x+dx; int ny=y+dy; if(!inside(nx,ny)||G[nx][ny]=='#'||vis[nx][ny]) continue; if(G[nx][ny]=='x') Q.push(Point(nx,ny,step+2)); else Q.push(Point(nx,ny,step+1)); vis[nx][ny]=1; } } return -1; } int main() { int T; cin>>T; while(T--) { cin>>R>>C; for(int i=0;i<R;i++) for(int j=0;j<C;j++) { cin>>G[i][j]; if(G[i][j]=='a') r1=i,c1=j; else if(G[i][j]=='r') r0=i,c0=j; } memset(vis,0,sizeof(vis)); int ans=bfs(r0,c0); if(ans==-1) cout<<"Impossible"<<endl; else cout<<ans<<endl; } return 0; }
相关文章推荐
- PAT-B 1019. 数字黑洞
- 百练 04 简单的整数划分问题
- Java操作Mongodb(转载)
- angular的http三种请求方式
- 切片的更多操作方法
- spark在linux下开发使用程序包下载 tgz
- L - Kefa and Company
- 牛逼哄哄的SLAM技术 即将颠覆哪些领域?
- linux 新建一个管理员用户admin,需要使用的参数()
- Java操作Mongodb(转载)
- 理解逐次逼近寄存器型ADC:与其它类型ADC的架构对比【转】
- java订电影票系统
- 设计模式综述
- K - Spongebob and Joke
- 你必须了解的Session的本质
- hdoj-2060-Snooker
- 【CodeForces】 612A - The Text Splitting
- TCP协议如何来保证传输的可靠性
- Sample rate 理解
- Uncowed Forces