33,008
社区成员
发帖
与我相关
我的任务
分享
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 50
struct node{
int G;
int index;
}list[MAX*MAX+8],xchang;
char hash[256];
char flag[MAX*MAX+8];
int save[MAX+1][MAX+1];
int index_list[MAX*MAX+8];
int move[4][2] = {1,0,0,1,-1,0,0,-1};
void changlist(int a,int b)
{
xchang = list[a];
list[a] = list[b];
list[b] = xchang;
index_list[list[a].index] = a;
index_list[list[b].index] = b;
}
int DIJKSTRA(int x1,int y1,int x2,int y2,int R,int S)
{
int i,j,k,x,y,h;
int value,pos,from,to,len;
memset(flag,0,sizeof(char)*(R*S+8));
to = (x2-1)*S+y2;
from = (x1-1)*S+y1;
changlist(1,from);
list[1].G = 0;
len = R*S - 1;
while(list[1].index != to)
{
value = list[1].G;
pos = list[1].index;
flag[pos] = 1;
x = (pos-1)/S;
y = (pos-1)%S;
list[1] = list[len]; //删除堆顶点
len--; //修改堆的下限
for(i=1;i<=len;i = j)//向下修改堆(修改了顶点)
{
j = i;
if(i*2<=len)
{
if(list[j].G>list[i*2].G) j = i*2;
}
if(i*2+1<=len)
{
if(list[j].G>list[i*2+1].G) j = i*2+1;
}
if(i==j) break;
else changlist(i,j);
}
for(k=0;k<4;k++) //扩展下一层节点
{
if(x+move[k][0] >=0 && x+move[k][0] < R
&& y+move[k][1] >=0 && y+move[k][1] <S)
{
h = (x+move[k][0])*S+y+move[k][1] + 1;
if(flag[h] == 0)
{
h = index_list[h];
if(value + save[x+move[k][0]][y+move[k][1]] < list[h].G)
{
list[h].G = value + save[x+move[k][0]][y+move[k][1]];
for(i=h;i>1;i=i/2)//修改堆中节点值
{
if(list[i].G<list[i/2].G) changlist(i,i/2);
else break;
}
}
}
}
}
}
return list[1].G;
}
int main()
{
char t[2];
int i,j;
int m,r,s;
int x1,y1,x2,y2;
hash['G'] = 5; hash['M'] = 10; hash['S'] = 20;
while(scanf("%d",&m)!=EOF)
{
while(m--)
{
scanf("%d%d",&r,&s);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(i=0;i<r;i++)
{
for(j=0;j<s;j++)
{
scanf("%s",t);
save[i][j] = hash[t[0]];
}
}
for(i=1;i<=r*s;i++)
{
list[i].index = i;
list[i].G = 0x7fffffff;
index_list[list[i].index] = i;
}
printf("%d\n",DIJKSTRA(x1,y1,x2,y2,r,s));
}
}
return 0;
}