因为距离不同所以不能用广搜。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
int n,m,k;
double v;
char c[76][76];
int vstd[6000];
double d[6000];
int dirx[]={-1,-1,-1,0,1,1,1,0};
int diry[]={-1,0,1,1,1,0,-1,-1};
const int INF=0xffffff;
double dis[]={sqrt(2),1};
bool ok(int x,int y)
{
return (x>=0 && x<m && y>=0 && y<n);
}
void init()
{
int i;
for (i=0;i<m*n;i++)
d[i]=INF;
}
int main()
{
scanf("%d%d%d%lf",&n,&m,&k,&v);
int i,j;
for (i=0;i<m;i++)
scanf("%s",c[i]);
int x0,y0;
int x,y;
scanf("%d%d",&y0,&x0);
x0--;
y0--;
double total=0;
for (i=0;i<k;i++)
{
memset(vstd,0,sizeof(vstd));
init();
scanf("%d%d",&y,&x);
x--;
y--;
int u=x0*n+y0;
int ans=x*n+y;
vstd[u]=1;
d[u]=0;
queue<int> Q;
Q.push(u);
while (!Q.empty())
{
int front=Q.front();
int xx=front/n;
int yy=front%n;
for (j=0;j<8;j++)
{
int uu=xx+dirx[j];
int vv=yy+diry[j];
u=uu*n+vv;
if (ok(uu,vv) && c[uu][vv]=='.' && d[front]+dis[j%2]<d[u])
{
d[u]=d[front]+dis[j%2];
if (!vstd[u])
{
Q.push(u);
vstd[u]=1;
}
}
}
vstd[front]=0;
Q.pop();
}
if (d[ans]!=INF)
{
x0=x;
y0=y;
total+=d[ans];
}
}
printf("%.2f\n",total/v);
}