(HDU)1010 -- Tempter of the Bone (骨头的诱惑)

题目链接:https://vjudge.net/problem/HDU-1010

深度优先搜索典型例题

月下版本代码;

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdlib>

using namespace std;

char map[9][9];
int n,m,t,di,dj;
bool escape;
int delta[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
void dfs(int si,int sj,int cnt)
{
    int i,temp;
   if(si>n||sj>m||si<=0||sj<=0) return;
   if(cnt==t&&si==di&&sj==dj)    escape=1;
   if(escape) return;

   temp=(t-cnt)-abs(si-di)-abs(sj-dj);
   if(temp<0||temp&1) return;
   for(i=0;i<4;i++){
      if(map[si+delta[i][0]][sj+delta[i][1]]!='X')
      {
         map[si+delta[i][0]][sj+delta[i][1]]='X';
         dfs(si+delta[i][0],sj+delta[i][1],cnt+1);
         map[si+delta[i][0]][sj+delta[i][1]]='.';
      }
   }
   return;
}

int main()
{
    int i,j,si,sj;
    while(cin>>n>>m>>t)
    {
      if(n==0&&m==0&&t==0) break;
      int wall=0;
      for(i=1;i<=n;i++)
         for(j=1;j<=m;j++)
         {
            cin>>map[i][j];
            if(map[i][j]=='S') { si=i; sj=j; }
            else if(map[i][j]=='D') { di=i; dj=j; }
            else if(map[i][j]=='X') wall++;
         }
       if(n*m-wall<=t)
       {
           cout<<"NO"<<endl;
           continue;
       }
       escape=0;
       map[si][sj]='X';
       dfs(si,sj,0);
       if(escape) cout<<"YES"<<endl;
       else cout<<"NO"<<endl;
   }
   return 0;
}

 

posted @ 2016-12-06 21:30  ACDoge  阅读(280)  评论(0编辑  收藏  举报