Problem Description
Due to the curse made by the devil,Xiao Ming is stranded on a mountain and can hardly escape.
This mountain is pretty strange that its underside is a rectangle which size is
n∗m and every little part has a special coordinate
(x,y)and a height
H.
In order to escape from this mountain,Ming needs to find out the devil and beat it to clean up the curse.
At the biginning Xiao Ming has a fighting will
k,if it turned to
0 Xiao Ming won't be able to fight with the devil,that means failure.
Ming can go to next position
(N,E,S,W)from his current position that time every step,
(abs(H1−H2))/k 's physical power is spent,and then it cost
1 point of will.
Because of the devil's strong,Ming has to find a way cost least physical power to defeat the devil.
Can you help Xiao Ming to calculate the least physical power he need to consume.
Input
T(T≤10), indicating the number of testcases.
Then
T testcases follow.
The first line contains three integers
n,m,k ,meaning as in the title
(1≤n,m≤50,0≤k≤50).
Then the
N ×
M matrix follows.
In matrix , the integer
H meaning the height of
(i,j),and '#' meaning barrier (Xiao Ming can't come to this) .
Then follow two lines,meaning Xiao Ming's coordinate
(x1,y1) and the devil's coordinate
(x2,y2),coordinates is not a barrier.
Output
NoAnswer" otherwise.
(The result should be rounded to 2 decimal places)
Sample Input
3
4 4 5
2134
2#23
2#22
2221
1 1
3 3
4 4 7
2134
2#23
2#22
2221
1 1
3 3
4 4 50
2#34
2#23
2#22
2#21
1 1
3 3
Sample Output
1.03
0.00
No Answer
广搜
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 105;
int T, n, m, k, bx, by, ex, ey;
int a[maxn][maxn];
int c[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
double f[maxn][maxn][maxn];
char s[maxn];
struct point
{
int x, y, z;
point(){};
point(int x, int y, int z) :x(x), y(y), z(z){};
};
void bfs()
{
for (int i = 1; i <= n;i++)
for (int j = 1; j <= m;j++)
for (int u = 0; u <= k; u++) f[i][j][u] = 0x7FFFFFFF;
queue<point> p;
p.push(point(bx, by, 0));
f[bx][by][0] = 0;
while (!p.empty())
{
point q = p.front(); p.pop();
if (q.z >= k) continue;
for (int i = 0; i < 4; i++)
{
int x = q.x + c[i][0];
int y = q.y + c[i][1];
if (x<1 || x>n || y<1 || y>m || a[x][y] < 0) continue;
double ans = 1.0*abs(a[x][y] - a[q.x][q.y]) / (k - q.z);
if (f[x][y][q.z + 1]>f[q.x][q.y][q.z] + ans)
{
f[x][y][q.z + 1] = f[q.x][q.y][q.z] + ans;
p.push(point(x, y, q.z + 1));
}
}
}
double ans = 0x7FFFFFFF;
for (int i = k - 1; i >= 0; i--) ans = min(ans, f[ex][ey][i]);
if (ans + 1e-5 < 0x7FFFFFFF) printf("%.2lf\n", ans);
else printf("No Answer\n");
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++)
{
scanf("%s", s + 1);
for (int j = 1; j <= m; j++)
if (s[j] == '#') a[i][j] = -1; else a[i][j] = s[j] - '0';
}
scanf("%d%d%d%d", &bx, &by, &ex, &ey);
if (k) bfs(); else printf("No Answer\n");
}
return 0;
}