Dijkstra算法之二
//sicily 1321. Robot
#include<iostream> //Dijkstra算法
using namespace std;
#define MaxWeight 99999
int table[110][110],S[10010],dist[10010]; //S[]记录是否访问过,dist[]记录各点到起点的最短距离
int move[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int main()
{
int cases,m,n,x1,y1,x2,y2,i,j;
cin>>cases;
while(cases--)
{
cin>>m>>n;
for(i=0;i<m;++i)
for(j=0;j<n;++j)
cin>>table[i][j];
cin>>x1>>y1>>x2>>y2;
fill(dist,dist+m*n,MaxWeight);
dist[(x1-1)*n+y1-1]=0;
fill(S,S+m*n,0);
int min,u,v,x,y;
for(i=1;i<=m*n;++i) //寻找各点最短路径,因为一开始起点是看作还未被遍历过的,(从fill(S,S+m*n,0);可以看出),所以这里循环次数为全部顶点数
{
min=MaxWeight;
for(j=0;j<m*n;++j)
if(!S[j]&&dist[j]<min)
{
u=j;min=dist[j];
}
S[u]=1;
x=u/n;y=u%n;
if(x+1==x2&&y+1==y2) //如果探测到终点即可退出
{
cout<<dist[u]+table[x1-1][y1-1]<<endl; //要加上起点所需的费用
break;
}
for(j=0;j<4;++j)
{
int tx=x+move[j][0],ty=y+move[j][1];
if(tx>=0&&tx<m&&ty>=0&&ty<n)
{
v=tx*n+ty;
if(S[v]==0&&dist[u]+table[tx][ty]<dist[v])
{
dist[v]=dist[u]+table[tx][ty];
}
}
}
}
}
return 0;
}