DFS(混境之地)

#include <iostream>
using namespace std;
const int N=1e3+9;
const int tmax=1;
bool visit[N][N][tmax+1];//这样只可以代表0,1
int h[N][N];
bool flag=false;
int n,m,k;
int A,B,C,D;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
bool inmp(int x,int y){
  if(x>=1&&x<=n&&y>=1&&y<=m) return true;
  else return false;
}
 void dfs(int x,int y ,int t){
   if(flag||(x==C&&y==D)){
     flag=true;
     return;
   }
   if(visit[x][y][t]) return;
   visit[x][y][t]=true;
   
   for(int i=0;i<4;++i){
     int nx=x+dx[i];
     int ny=y+dy[i];
     if(!inmp(nx,ny)) continue;

     //先不用燃料
     //当这样设置的时候会提前剪枝。例如(先往上面访问,并且可以进入if语句,那么visit[x][y][t]就置为true,然后发现上面行不通的时候开始往下面走,但是这个时候这个visit[x][y][t]已经设为true,这就导致其他三个方向的无法进入。)
     //最好的方法就是到大(x,y)点,设置为true,然后开始以这个为圆心,往外面扩展
     if(h[x][y]>h[nx][ny]){
      dfs(nx,ny,t);
     }
     if(h[x][y]+k>h[nx][ny]&&t<tmax){//并且还有燃料可以用
       dfs(nx,ny,t+1);
     }
   } 
 }
int main()
{
  cin>>n>>m>>k;
 cin>>A>>B>>C>>D;
 //布尔值默认为0
 for(int i=1;i<=n;++i){
   for(int j=1;j<=m;++j){
     cin>>h[i][j];
   }
 }
 dfs(A,B,0);
 cout<<(flag?"Yes":"No");
  // 请在此输入您的代码
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值