zoj 2110 DFS

来源:互联网 发布:北京数据恢复华军 编辑:程序博客网 时间:2024/04/27 21:24
// zoj 2110  #include<stdio.h>#include<math.h>char map[9][9];int m,n,t;int di,dj;bool escape;int dir[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(si==di&&sj==dj&&cnt==t)    {        escape=1;        return ;    }    temp=t-cnt-fabs(si-di)-fabs(sj-dj);    if(temp<0 || temp%2) return ;    for(i=0;i<4;i++)    {        if(map[si+dir[i][0]][sj+dir[i][1]]!='X')        {            map[si+dir[i][0]][sj+dir[i][1]]='X';            dfs(si+dir[i][0],sj+dir[i][1],cnt+1);            if(escape)  return ;            map[si+dir[i][0]][sj+dir[i][1]]='.';        }    }    return ;}int main(){    int i,j,si,sj;   // freopen("input.txt","r",stdin);    while(scanf("%d%d%d",&n,&m,&t))    {        if(n==0 && m==0 && t==0)  break;        int wall=0;        char temp;        scanf("%c",&temp);        for(i=1;i<=n;i++)        {            for(j=1;j<=m;j++)            {                scanf("%c",&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++;            }            scanf("%c",&temp);        }        if(n*m-wall<=t)        {            printf("NO\n");            continue;        }        escape=0;        map[si][sj]='X';        dfs(si,sj,0);        if(escape) printf("YES\n");        else printf("NO\n");    }   return 0;}