混境之地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;
}