这是另一个维度的简单最短距离问题的示例,尝试像这样制定问题,cost[n][m][max_height] = {INFINITY};
成本[srcX][srcY][高度[srcX][srcY]] = 0;
现在 q_ht 的 cost[x+1][y][ht] = min(cost[x+1][y][ht], cost[x][y][q_ht] + (q_ht - ht) ) max_height 到 ht。这个想法是从任何允许的高度(即高度> = ht)以最小的成本到达(x + 1,y,ht)。这再次我们需要计算所有 ht(0 到 max_height)。完整的实现在这里: -
#define HIGHVAL 100000000
#define XI (x + a[i])
#define YI (y + b[i])
int n,m;
bool isvalid(int x,int y)
{
return (x>=0 && y>=0 && x<n && y<m);
}
int main()
{
int pondX, pondY;
int farmX, farmY;
cin>>n>>m>>pondX>>pondY>>farmX>>farmY;
pondX--, pondY--, farmX--, farmY--;
int height[n][m];
string s;
for(int i=0; i<n; i++)
{
cin>>s;
for(int j=0; j<m; j++)
height[i][j] = (int)(s[j] - '0');
}
int ht = height[pondX][pondY];
int cost[n][m][ht+1];
bool visited[n][m];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
for(int k=0; k<ht+1; k++)
cost[i][j][k] = HIGHVAL;
cost[pondX][pondY][ht] = 0;
int a[4]= {0,0,1,-1};
int b[4]= {1,-1,0,0};
int ci = pondX, cj = pondY;
queue<int> qx;
queue<int> qy;
visited[pondX][pondY] = 1;
memset(visited, 0, sizeof(visited));
qx.push(pondX);
qy.push(pondY);
while(qy.size())
{
int x = qx.front();
int y = qy.front();
qx.pop();
qy.pop();
for(int i=0; i<4; i++)
{
int temp = 0;
if(isvalid(XI, YI))
{
if(!visited[XI][YI])
{
qx.push(XI);
qy.push(YI);
visited[XI][YI] = 1;
temp = 1;
}
for(int j=ht; j>=0; j--)
{
int q = HIGHVAL;
for(int k=ht; k>=j; k--)
{
q = min(q, cost[x][y][k] + abs(j - height[XI][YI]));
}
if(cost[XI][YI][j] > q)
{
cost[XI][YI][j] = q;
if(visited[XI][YI] && !temp)
{
qx.push(XI);
qy.push(YI);
}
}
}
}
}
}
int ans=HIGHVAL;
for(int i=0; i<=ht; i++)
ans = min(ans, cost[farmX][farmY][i]);
cout<<ans;
//cout<<" "<<n<<m;
return 0;
}