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 1020. Big Integer
- soj1041. Pushing Boxes
- Sicily 1046, Plane Spotting
- SICILY 1934 移动小球
- 1920. Divide The Stones
- 1801. Reading books
- 1874. Three little pigs
- 导游 解题报告(Floyd-Warshall 算法)
- Sicily 1121. Tri Tiling
- Sicily 1090. Highways
- Sicily 1155. Can I Post the lette
- Sicily 1200. Stick
- Sicily 1342. 开心的金明
- Sicily 1153. 马的周游问题
- Sicily 1171. The Game of Efil
- 1007[To and Fro]
- 1014[Specialized Four-Dig]
- 1024[MJ, Nowhere to Hide]
- 1036[Crypto Columns]
- 1147[谁拿了最多奖学金]