HDU 1010 Tempter of the Bone

分析:迷宫问题,要求从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;
  }



 

你可能感兴趣的:(ACM)