• HDU 1010 Tempter of the Bone DFS 简单题 注意剪枝


    题意:一只小狗要刚好在t时刻从起点都到终点,问可不可以。

    注意剪枝。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 using namespace std;
     5 int maze[9][9];
     6 bool vis[9][9];
     7 int n,m,t;
     8 bool ans;
     9 struct Point
    10 {
    11     int x,y;
    12 };
    13 int dx[4]={0,0,-1,1};
    14 int dy[4]={1,-1,0,0};
    15 Point p,e;
    16 void dfs(Point cur,int dep)
    17 {
    18     vis[cur.x][cur.y]=true;
    19     if(!ans&&cur.x==e.x&&cur.y==e.y&&dep==t)
    20     {
    21         ans=true;
    22         return ;
    23     }
    24     if(!ans&&dep>t)
    25         return ;
    26     for(int i=0;i<4;i++)
    27     {
    28         Point dcur;
    29         dcur.x=cur.x+dx[i];
    30         dcur.y=cur.y+dy[i];
    31         if(dcur.x<1||dcur.x>n||dcur.y<1||dcur.y>m)
    32             continue;
    33         if(vis[dcur.x][dcur.y])
    34             continue;
    35         if(!maze[dcur.x][dcur.y])
    36             continue;
    37         if(!ans)
    38         {
    39             dfs(dcur,dep+1);
    40             vis[dcur.x][dcur.y]=false;//注意回溯
    41         }
    42     }
    43 }
    44 int main()
    45 {
    46     while(scanf("%d%d%d",&n,&m,&t))
    47     {
    48         if(n==0&&m==0&&t==0)
    49             break;
    50         char s[15];
    51         for(int i=1;i<=n;i++)
    52         {
    53             scanf("%s",s+1);
    54             for(int j=1;j<=m;j++)
    55             {
    56                 if(s[j]=='X')
    57                     maze[i][j]=0;
    58                 else if(s[j]=='.')
    59                     maze[i][j]=1;
    60                 else if(s[j]=='S')
    61                 {
    62                     p.x=i;
    63                     p.y=j;
    64                     maze[i][j]=1;
    65                 }
    66                 else
    67                 {
    68                     e.x=i;
    69                     e.y=j;
    70                     maze[i][j]=1;
    71                 }
    72             }
    73         }
    74         ans=false;
    75         memset(vis,false,sizeof(vis));
    76         int a=abs(e.x+e.y-p.x-p.y);
    77         if(a>t)    //剪枝
    78             ans=false;
    79         else if(a%2!=t%2)   //剪枝
    80             ans=false;
    81         else
    82             dfs(p,0);
    83         if(ans)
    84             printf("YES
    ");
    85         else
    86             printf("NO
    ");
    87     }
    88     return 0;
    89 }
    提交代码
  • 相关阅读:
    (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误
    HTTP KeepAlive模式
    Windows 7 中的 God Mode
    我的开发环境配置经验
    C#格式化数值结果表(格式化字符串)
    我可怜的笔记本电脑
    JetBrains ReSharper 5.x 注册机
    异常处理准则
    调用 Windows 7 中英文混合朗读
    oracle笔记(2010130)
  • 原文地址:https://www.cnblogs.com/-maybe/p/4394923.html
Copyright © 2020-2023  润新知