dijkstra+二分,应该是正解...
但神秘挂成30,调不出来了 QwQ
#include <bits/stdc++.h>
const int Maxn = 105;
const int eps = 1e-5;
int n, m;
int sx, sy, tx, ty;
bool maps[Maxn][Maxn];
double s;
bool vis[Maxn][Maxn];
double dis[Maxn][Maxn];
int d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
double ans;
struct node {
int x, y;
double dist;
friend bool operator < (const node a, const node b) {
return a.dist > b.dist;
}
};
std::priority_queue<node> q;
double dijkstra(int sx, int sy, int tx, int ty, double k) {
int i, j;
dis[sx][sy] = 0;
q.push({sx, sy, 0});
while (!q.empty()) {
node u = q.top(); q.pop();
if (vis[u.x][u.y] == 1) continue;
vis[u.x][u.y] = 1;
for (i = 0; i < 4; i++) {
node v = {u.x + d[i][0], u.y + d[i][1], u.dist + ((i == 1 || i == 3) ? k : 1.0)};
if (v.x >= 1 && v.x <= n && v.y >= 1 && v.y <= m) {
if (maps[v.x][v.y] == 0) {
if (dis[v.x][v.y] > v.dist) {
dis[v.x][v.y] = v.dist;
q.push(v);
}
}
}
}
}
return dis[tx][ty];
}
double check(double k) {
int i, j;
memset(vis, 0, sizeof(vis));
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
dis[i][j] = 1e15 + 7;
}
}
while (!q.empty()) q.pop();
return dijkstra(sx, sy, tx, ty, k);
}
int main() {
int i, j;
scanf("%d %d", &n, &m);
scanf("%d %d %d %d", &sx, &sy, &tx, &ty);
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++) {
scanf("%d", &maps[i][j]);
}
}
scanf("%lf", &s);
double l = 0, r = s;
while (l + eps < r) {
double mid = (l + r) / 2;
double tmp = check(mid);
if (tmp == s) {
ans = mid;
break;
}
else if (tmp < s) l = mid;
else r = mid;
}
printf("%.3lf\n", ans);
return 0;
}
/*
4 4
1 1 4 4
0 0 1 1
1 0 0 0
0 0 1 0
0 0 0 0
5.00
*/