hdu~1010(dfs)

来源:互联网 发布:淘宝3c数码配件 编辑:程序博客网 时间:2024/05/23 01:59

题目链接


#include <stdio.h>#include <math.h>int m,n,t,flag; //行列,是否到终点的标记int sx,sy,ex,ey; int xmove[5]={0,0,1,0,-1},ymove[5]={0,1,0,-1,0}; //记录四个方向char a[10][10];void dfs(int x,int y,int tt){    int i;    if(t==tt && x==ex && y==ey) //到终点    {        flag=1;        return ;    }    if(tt>t) //时间剪枝        return ;            if(abs(x-ex)+abs(y-ey)>(t-tt)) //路程剪枝        return ;            for(i=1;i<=4;i++)    {        int tx=x+xmove[i];        int ty=y+ymove[i];        if(tx>m || tx<1 || ty>n || ty<1 || a[tx][ty]=='X')//判断当前点是否超范围或是否撞墙            continue ;        a[x][y]='X'; //符合则上一个点标记为墙,表示已走过        dfs(tx,ty,tt+1);        if(flag)            return ;        else            a[x][y]='.';    }}int main(){    while(scanf("%d %d %d",&m,&n,&t)!=EOF)    {        if(m==0 && n==0 && t==0)            return 0;                int k=0;        flag=0;         int i,j;        for(i=1;i<=m;i++)        {            scanf("%s",&a[i][1]);            for(j=1;j<=n;j++)            {                if(a[i][j]=='S')                {                    sx=i;                    sy=j;                }                if(a[i][j]=='D')                {                    ex=i;                    ey=j;                }                if(a[i][j]=='.')                    k++;            }        }        if((abs(sx-ex)+abs(sy-ey)+t)%2==1 || k+1<t)//神奇的奇偶剪枝,这是一个很关键的地方        {            printf("NO\n");            continue;        }        dfs(sx,sy,0);         if(flag)            printf("YES\n");        else            printf("NO\n");    }    return 0;}


0 0
原创粉丝点击