//这个实现应该算是将每个点到初始点的最短路径都利用dijkstra算法计算出来然后再找需要的终点的最短路径
//最关键的问题就是别忘记了怎么初始化各个点相应的消耗否则就fata error咯
#include "iostream"
#include "cstring"
#include "algorithm"
#include "queue"
using namespace std;
int best[1000][1000];
int n,m,cases;
int dirx[4]={1,-1,0,0};
int diry[4]={0,0,-1,1};
int vis[1000][1000];
struct point{
int x;
int y;
};//建立自定义的结构方便处理数组
int tag;
queue<point>q;
bool en(point a){
return(a.x>0&&a.y>0&&a.x<=n&&a.y<=m);
}//越界的情况别忘记
void dfs(point a,point b){
q.push(a);
point flag;
flag.x=a.x;
flag.y=a.y;
tag=0;
best[a.x][a.y]=0;
while(!q.empty()){
point t = q.front();
q.pop();
point _n;
for (int i = 0; i < 4; ++i)
{
_n.x=t.x+dirx[i];
_n.y=t.y+diry[i];
// cout<<"run tag "<<t.x<<" "<<t.y<<" "<<tag++<<endl;
// cout<<_n.x<<" "<<_n.y<<endl;
if(en(_n)&&best[_n.x][_n.y]>best[t.x][t.y]+vis[_n.x][_n.y]){
best[_n.x][_n.y]=best[t.x][t.y]+vis[_n.x][_n.y];
flag.x=_n.x;
flag.y=_n.y;
// cout<<"inside"<<endl;
q.push(flag);
}
}
}
}
int main(){
point st,ed;
cin>>cases;
while(cases--){
cin>>n>>m;
memset(vis, 1000, sizeof(vis));
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cin>>vis[i][j];
best[i][j]=100001;
}
}
cin>>st.x>>st.y>>ed.x>>ed.y;
dfs(st,ed);
cout<<best[ed.x][ed.y]+vis[st.x][st.y]<<endl;
}
}
sicily1321-robot
最新推荐文章于 2017-06-06 21:40:40 发布