sicily 1321. Robot


// 题意:给出一个矩阵表示经过每一点时耗费的油量,可以向上下左右四个方向移动,
// 问从起点(x1,y1)到终点(x2,y2)所耗费的最小油量

#include <iostream> // 邻接矩阵实现Dijkstra算法
#include <stdio.h>

#include <cstring>
using namespace std;
const int MAXN=10000;
const int INF=100000;
int m,n,cost[MAXN],distD[MAXN],vis[MAXN];
int sx,sy,tx,ty; //起点(sx,sy)和终点(tx,ty)
int dx[4]={0,0,1,-1};

int dy[4]={1,-1,0,0};
void init()
{
scanf("%d%d",&m,&n); // m 行 n 列
int c;

for(int i=0;i<m;++i)
for(int j=0;j<n;++j)
{
scanf("%d",&c);
cost[ i * n + j ] = c;
}
scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
sx--;sy--;tx--;ty--; // 这里下标需要自减 1 ,因为结点下标从0开始
}

void Dijkstra(int st) //从源点st到其余各顶点的最短路径长度
{

memset(vis,0,sizeof(vis));
for(int i=0; i < m * n ;++i) //结点下标从0开始,共有 m * n 个结点
distD[i] = ( i==st ? 0 : INF );

for(int i=0; i < m * n ;++i) //对全部顶点计算最短路径
{

int p,min_d=INF;
for(int j=0; j < m * n ;++j)
if( !vis[j] && distD[j]<min_d )
min_d = distD [ p = j ] ;
vis[p]=1;
if( p == tx * n + ty ) // 如果探测到终点即可退出
{

printf("%d\n",distD[p]+cost[sx*n+sy]); //要加上起点所需的费用
break;

}
for(int d=0;d<4;++d)
{
int newx=p/n+dx[d],newy=p%n+dy[d];
int newp=newx*n+newy;
if( newx>=0&&newx<m&&newy>=0&&newy<n && !vis[newp] && distD[p] + cost[newp] < distD[newp] )
{
distD[newp]=distD[p]+cost[newp];
}
}
}
}
int main()
{
int cases;
cin>>cases;
while(cases--)
{
init();
Dijkstra(sx*n+sy); // 顶点坐标[x,y],则在队列对应的下标是 x * n + y
}

return 0;
}

posted on 2011-07-10 17:29  sysu_mjc  阅读(294)  评论(0编辑  收藏  举报

导航