小墨在努力!!
吗了个b的。。。。。

#include <stdio.h>
#include <stdlib.h>
const int step[4][2]={-1,0,0,1,1,0,0,-1};//上下左右四个方向
char maze[10][10];
int ex,ey,t,YS,n,m;
void dfs(int x,int y)
{
    /*for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        printf("%c",maze[i][j]);
        printf("\n");
    }
    printf("%d--",t);*/   //走一步打印一下表当前的情况和时间
    if(x==ex&&y==ey&&t==0)
    { YS=1; return ;}
    else if(x==n||y==m||x==-1||y==-1)
         return ;
    int d = t-abs(x-ex)-abs(y-ey);
    if(d<0||d%2==1) return ;
    for(int i=0;i<=3;i++)
    {
         if((maze[x+step[i][0]][y+step[i][1]]=='.'||maze[x+step[i][0]][y+step[i][1]]=='D')&&t>0)
         {
              t=t-1;
              //printf("%d--%d--%d\n\n",i,x+step[i][0],y+step[i][1]);
              maze[x+step[i][0]][y+step[i][1]]='X';
              dfs(x+step[i][0],y+step[i][1]);
              if (YS) return ;
              maze[x+step[i][0]][y+step[i][1]]='.';            
              t=t+1;
         }
    }
}
int main()
{
    int sx,sy,wall;
    while(scanf("%d%d%d",&n,&m,&t)&&(n!=0||m!=0&&t!=0))
    {
         wall=0,YS=0;
         for(int i=0;i<n;i++)
         for(int j=0;j<m;j++)
         {
              scanf(" %c",&maze[i][j]);
              if(maze[i][j]=='S')
              {   sx = i , sy = j ; maze[i][j]='X';}
              else if(maze[i][j]=='D')
              {   ex = i , ey = j; }
              else if(maze[i][j]=='X')
                 wall++;
         }
       // printf("%d %d %d %d %d\n",sx,sy,ex,ey,wall);   打印一下入口和出口
        if((abs(sx-ex)+abs(sy-ey)>t)||m*n-wall<=t)
              printf("NO\n");
        else
        {
              dfs(sx,sy);
              if(YS) printf("YES\n");
              else printf("NO\n");
        }
    }
    return 0;
}

虽然这道题这各个oj上都被刷烂了,但是我去WA了好几次,还有重要的是减枝

一个是奇偶减枝,一个是边界减枝

posted on 2011-10-20 13:37  小墨在努力!!  阅读(466)  评论(0编辑  收藏  举报