您的位置:首页 > 其它

sicily 1008. Robot

2016-01-11 16:22 381 查看

题目大意:

给一个矩阵,每一个点上面的数字表示走到该点需要的花费,找出给定起点到终点的最小总花费

思路:

每个格子看作一个结点,花费可以看作从上一个点走到这个点的路程,那么这道题就是典型的最短路径问题,可以用Dijkstra算法解决。 这里使用了优先队列q来优化。整个流程类似Dijkstra算法,需要注意的地方是这里每次将一个结点加入时只是简单的将相邻的4个结点放入到候选队列q中,所以q里面可能会出现重复的或者已经找到的结点,所以每次在队列中先将顶部已经完成的结点去掉。

#include<iostream>
#include<queue>
#include<memory.h>
using namespace std;
class point{
public:
int x;
int y;
int distance;
friend  bool operator<(const point &a,const point &b){
return a.distance>b.distance;
}
point(int x,int y,int distance):x(x),y(y),distance(distance){
}
};
int main(){
int T;
cin>>T;
int n,m;
int start_x,start_y,end_x,end_y;
int matrix[101][101];
bool flag[101][101];//whether been  determinated
int move_x[4]={0,0,1,-1};
int move_y[4]={1,-1,0,0};
while(T--){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>matrix[i][j];
}
cin>>start_x>>start_y>>end_x>>end_y;
memset(flag,false,sizeof(flag));
priority_queue<point> q;
q.push(point(start_x,start_y,matrix[start_x][start_y]));
point cur(start_x,start_y,matrix[start_x][start_y]);
while(!q.empty() && (!(q.top().x==end_x && q.top().y==end_y))){
cur=q.top();
while(flag[cur.x][cur.y]){
q.pop();
cur=q.top();
}
flag[cur.x][cur.y]=true;
for(int i=0;i<4;i++){
int x=move_x[i]+cur.x;
int y=move_y[i]+cur.y;
if(x>=1 && x<=n && y>=1 && y<=m){
q.push(point(x,y,cur.distance+matrix[x][y]));
}
}
}
cout<<q.top().distance<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sicily