#include<cstdio> #include<iostream> using namespace std; char maze[9][9]; int n,m,t,flag; int starti,startj,endi,endj; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; void DFS(int px,int py,int time)
{ if(flag==1) return;; if(px<1||px>n||py<1||py>m||time>t) return; if(px==endi&&py==endj&&time==t) {flag=1;return ;} if(maze[px][py]=='X') return ; for(int i=0;i<4;i++){
        maze[px][py]='X';
        DFS(px+dir[i][0],py+dir[i][1],time+1);
        maze[px][py]='.'; if(flag==1) return;
    } int main(){ while(cin>>n>>m>>t){ if(n==0&&m==0&&t==0) break; int count=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
                cin>>maze[i][j]; if(maze[i][j]=='S')
                {
                    startj=j;
                    starti=i;
                } if(maze[i][j]=='D'){
                    endj=j;
                    endi=i;
                } if(maze[i][j]=='X')count++;
            } if(n*m-count<t) {
            cout<<"NO"<<endl; continue;
        } if((endi+endj+starti+startj+t)%2!=0) {
            cout<<"NO"<<endl; continue;
        }
        flag=0;
        DFS(starti,startj,0); if(flag==1){
            cout<<"YES"<<endl;
        } else cout<<"NO"<<endl;
    } return 0;
}

DFS    :要点 奇偶剪枝 即无论怎么走 总与最短路径相差一个偶数,所以要求步数于最短步数之和肯定为偶;

dfs更深的理解  总要记录每一个走过的点等走完后在撤销,并且是求一个联通路径,记住找到后标记推出不然体现不出dfs与bfs的优势