HDU 1010 Tempter of the Bone

本文介绍了一种解决迷宫问题的算法,通过深度优先搜索(DFS)找出从起点S到终点D恰好经过t步的可行路径。文章首先判断最短路径长度是否符合要求,再进行DFS遍历验证路径有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析:迷宫问题,要求从S恰好走t步到达D,如果从S到D的最短距离大于t或者S到D的距离和t一奇一偶都不可能到达,直接输入NO,否则Dfs搜索所有可能的路如果存在满足条件的就标记flag=1。

# include <stdio.h>
# include <string.h>
# define abs(x) x>0?x:-(x);
  int dx[4]={-1,0,1,0};
  int dy[4]={0,1,0,-1};
  int n,m,t,f,count,visit[10][10];
  char map[10][10];
  void DFS(int x0,int y0)
  {
      int i,a,b;
      if(count>t||f==1)
        return;
      if(count==t&&map[x0][y0]=='D')
        {f=1;return;}
      for(i=0;i<4;i++)
      {
          a=x0+dx[i];
          b=y0+dy[i];
          if(a>=0&&a<n&&b>=0&&b<m&&map[a][b]!='X'&&!visit[a][b])
          {
              visit[a][b]=1;
              count++;
              DFS(a,b);
              count--;
              visit[a][b]=0;
          }
      }
  }
  int main()
  {
      int i,j,x0,y0,x1,y1,d1,d2;
      while(scanf("%d%d%d",&n,&m,&t)!=EOF)
      {
          if(n==0&&m==0&&t==0)
            break;
          for(i=0;i<n;i++)
            scanf("%s",map[i]);
          for(i=0;i<n;i++)
            for(j=0;j<m;j++)
              if(map[i][j]=='S')
                x0=i,y0=j;
              else if(map[i][j]=='D')
                x1=i,y1=j;
          d1=abs(x1-x0);
          d2=abs(y1-y0);
          if((d1+d2>t)||(d1+d2+t)%2==1)
            {printf("NO\n");continue;}
          memset(visit,0,sizeof(visit));
          f=count=0;
          visit[x0][y0]=1;
          DFS(x0,y0);
          if(f==1)
            printf("YES\n");
          else
            printf("NO\n");
      }
      return 0;
  }



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值