zoj 2110 Tempter of the Bone

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1110

解题思路:DFS搜索

  1 ///////////////////////////////////////////////////////////////////////////
  2 //problem_id: zoj 2110
  3 //user_id: SCNU20102200088
  4 ///////////////////////////////////////////////////////////////////////////
  5 
  6 #include <algorithm>
  7 #include <iostream>
  8 #include <iterator>
  9 #include <iomanip>
 10 #include <cstring>
 11 #include <cstdlib>
 12 #include <string>
 13 #include <vector>
 14 #include <cstdio>
 15 #include <cctype>
 16 #include <cmath>
 17 #include <queue>
 18 #include <stack>
 19 #include <list>
 20 #include <set>
 21 #include <map>
 22 using namespace std;
 23 
 24 ///////////////////////////////////////////////////////////////////////////
 25 typedef long long LL;
 26 const double PI=acos(-1.0);
 27 ///////////////////////////////////////////////////////////////////////////
 28 
 29 ///////////////////////////////////////////////////////////////////////////
 30 //Add Code:
 31 int n,m,t,Di,Dj;
 32 char maze[10][10];
 33 const int x[]={0,1,0,-1};
 34 const int y[]={1,0,-1,0};
 35 
 36 bool DFS(int i,int j,int k){
 37     if(i<1 || i>n || j<1 || j>m) return 0;
 38     if(i==Di && j==Dj && k==t) return 1;
 39     int ii=abs(i-Di),jj=abs(j-Dj);  //ii+jj表示从当前位置走到门的最小步数
 40     if(ii+jj>t-k || (ii+jj+t-k)&1) return 0;  //最小步数大于剩余时间或最小步数与剩余时间奇偶性不同
 41     for(int p=0;p<4;p++){
 42         if(maze[i+x[p]][j+y[p]]=='.'){
 43             maze[i+x[p]][j+y[p]]='X';
 44             if(DFS(i+x[p],j+y[p],k+1)) return 1;
 45             maze[i+x[p]][j+y[p]]='.';
 46         }
 47     }
 48     return 0;
 49 }
 50 ///////////////////////////////////////////////////////////////////////////
 51 
 52 int main(){
 53     ///////////////////////////////////////////////////////////////////////
 54     //Add code:
 55     while(scanf("%d%d%d",&n,&m,&t)!=EOF){
 56         if(!(n||m||t)) break;
 57         int Si,Sj,cnt=0;
 58         char ch;
 59         scanf("%c",&ch);
 60         for(int i=1;i<=n;i++){
 61             for(int j=1;j<=m;j++){
 62                 scanf("%c",&maze[i][j]);
 63                 if(maze[i][j]=='S'){
 64                     Si=i;
 65                     Sj=j;
 66                     maze[i][j]='X';
 67                 }
 68                 else if(maze[i][j]=='D'){
 69                     Di=i;
 70                     Dj=j;
 71                     cnt++;
 72                     maze[i][j]='.';
 73                 }
 74                 else if(maze[i][j]=='.') cnt++;
 75             }
 76             scanf("%c",&ch);
 77         }
 78         if(cnt<t) printf("NO\n");  //可行点的个数小于时间t
 79         else{
 80             if(DFS(Si,Sj,0)) printf("YES\n");
 81             else printf("NO\n");
 82         }
 83     }
 84     ///////////////////////////////////////////////////////////////////////
 85     return 0;
 86 }
 87 
 88 ///////////////////////////////////////////////////////////////////////////
 89 /*
 90 Testcase:
 91 Input:
 92 4 4 5
 93 S.X.
 94 ..X.
 95 ..XD
 96 ....
 97 3 4 5
 98 S.X.
 99 ..X.
100 ...D
101 0 0 0
102 Output:
103 NO
104 YES
105 */
106 ///////////////////////////////////////////////////////////////////////////

posted on 2013-08-17 11:30  SCNU20102200088  阅读(137)  评论(0编辑  收藏  举报

导航