混境之地5
分析:
有一个二维矩阵代表的是a(i,j)的高度,给出一个起始坐标(a,b),以及一个终点坐标(c,d),问是否能到终点坐标。要求是:只能从高的a(i,j)走到低的位置,有一次从低位置跳到高位置的机会。
我们优先想到的就是dfs,但是当你敲出来代码后可能会超时,此时我们就该想到记忆化搜索。
我们可以定义一个数组dp[x][y][t],表示从起点到[x][y]使用t次喷气能到达的情况。
代码示例:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e3+5;
int n,m,k,sx,sy,fx,fy,h[N][N];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int dp[N][N][2];
bool inmp(int x,int y){
return (x>=1&&x<=n&&y>=1&&y<=m);
}
bool dfs(int x,int y,int t){
if(x==fx&&y==fy)return true;
for(int i=0;i<4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(!inmp(nx,ny))continue;
if(!t){
if(h[x][y]>h[nx][ny]&&dfs(nx,ny,0))return dp[x][y][t]=true;
if(h[x][y]+k>h[nx][ny]&&dfs(nx,ny,1))return dp[x][y][t]=true;
}else{
if(h[x][y]>h[nx][ny]&&dfs(nx,ny,1))return dp[x][y][t]=true;
}
}
return dp[x][y][t]=false;
}
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
memset(dp,-1,sizeof(dp));
cin>>n>>m>>k;
cin>>sx>>sy>>fx>>fy;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>h[i][j];
cout<<(dfs(sx,sy,0)?"Yes":"No");
return 0;
}