zoukankan      html  css  js  c++  java
  • hdu1010

    原本因为简单的dfs就可以 写完却发现不知道如何保留一条路的路径 不能保证一条路中的节点只被走一次 导致死循环

    还有各种剪枝

    代码算是跟别人一个模子刻出来的 递归 一直走那一条路 走过就标记上 回溯的时候再取消标记

    View Code
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include<string.h>
     4 #include<math.h>
     5 int k,d,num,flag,n,m,t,a[6];
     6 char c[10][10];
     7 void dfs(int x, int y)
     8 {
     9     int Min;
    10     if(flag==1||x == 0||x >n||y>m||y==0||c[x][y]=='X')
    11         return;
    12     if(c[x][y]=='D'&&num==t)
    13     {
    14         flag=1;
    15         return;
    16     }
    17     Min=abs(x-a[0])+abs(y-a[1]);
    18     if(num+Min>t||(num-t-Min)%2!=0)
    19         return;
    20     if(c[x][y]!='D')
    21         c[x][y]='X';
    22     num++;
    23     dfs(x+1,y);
    24     dfs(x,y+1);
    25     dfs(x-1,y);
    26     dfs(x,y-1);
    27     if(c[x][y]!='D')
    28         c[x][y]='.';
    29     num--;
    30 }
    31 int main()
    32 {
    33     int i, j,count,x,y;
    34     while(scanf("%d%d%d%*c", &n, &m, &t)!=EOF)
    35     {
    36         if(n == 0&&m == 0&&t == 0)
    37         break;
    38         k = 0;
    39         d = 0;
    40         count = 0;
    41         flag = 0;
    42         for(i = 1 ; i <= n ; i++)
    43         {
    44             c[i][0] = '*';
    45             c[i][m+1] = '*';
    46             for(j = 1 ; j <= m ; j++)
    47             {
    48                 c[0][j] = '*';
    49                 c[n+1][j] = '*';
    50                 scanf("%c", &c[i][j]);
    51                 if(c[i][j] == 'S')
    52                 {
    53                      x = i;
    54                      y = j;
    55                     num = 0;
    56                 }
    57                 if(c[i][j] == 'D')
    58                 {
    59                     a[0] = i;
    60                     a[1] = j;
    61                 }
    62                 if(c[i][j]=='X')
    63                     count++;
    64             }
    65             getchar();
    66         }
    67         if(n*m-count>t)
    68         {
    69             dfs(x,y);
    70         }
    71         if(flag == 1)
    72         printf("YES\n");
    73         else
    74         printf("NO\n");
    75     }
    76     return 0;
    77 }
  • 相关阅读:
    ssh 文件传输
    Alipay秘钥问题
    Linux kilin 安装和按键服务器步骤
    常用资源地址
    tomcat虚拟路径
    Dockerfile注意事项
    Ceph部署(二)RGW搭建
    Docker存储驱动之OverlayFS简介
    rdb map出错rbd sysfs write failed
    CEPH-DEPLOY INSTALL时,远端节点在执行APT-GET UPDATE命令时失败
  • 原文地址:https://www.cnblogs.com/shangyu/p/2582065.html
Copyright © 2011-2022 走看看