杭电acm1010

小菜鸟实在不知道哪里有问题  路过的大佬帮帮忙
#include<iostream>
#include<cmath>
using namespace std;
int n,m,t;
int flag=0;
int s_x,s_y,e_x,e_y;
char a[20][20];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void dfs(int x,int y,int s)
{
    int i,tem,n_x,n_y;
    if(x==e_x && y==e_y && s==t)
    {
        flag=1;
        return ;
    }
    tem=t-s-abs(e_x-x)-abs(e_y-y);
    if(tem%2!=0)  return;
    for(i=0;i<4;i++)
    {
        x=x+dir[i][0];
        y=y+dir[i][1];
        if(x>=0 &&x<n && y>=0 && y<m && a[x][y]!='X')
        {
            a[x][y]='X';
           /* for(int i=0;i<n;i++){
                for(int j=0;j<m;j++)
                cout<<a[i][j]<<" ";
                cout<<endl;}
                cout<<s+1<<endl;*/
            dfs(x,y,s+1);
        a[x][y]='.';
        }
    }
        return;
}
int main(){
    while(cin>>n>>m>>t&&n&&m&&t){
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {cin>>a[i][j];
            if(a[i][j]=='S')
                {s_x=i;//标记起始坐标
                s_y=j;}
            if(a[i][j]=='D')
                {
                    e_x=i;//标记门的坐标
                    e_y=j;
                }
            }
            flag=0;
            a[s_x][s_y]='X';
       dfs(s_x,s_y,0);//给深搜付初值   起点和步数
       if(flag)
        cout<<"Yes"<<endl;
       else
        cout<<"No"<<endl;
    }return 0;
}

猜你喜欢

转载自blog.csdn.net/bai_guo/article/details/80035585