zoukankan      html  css  js  c++  java
  • [VijosP1656]萌萌赶考 题解

    题目大意:

      有一个地图,有障碍,不能重复经过一点(但起点可以),判断能否恰好在t时刻从起点到达终点。

    思路:

      一开始DFS一遍,30分,于是要有优化减枝。最重要的是从起点到终点的距离的奇偶性是与起点与终点的曼哈顿距离的奇偶性一样(因为远离“最短路”后必将回来,所以会加一个偶数,奇偶性不变)当然还有其他,如最短距离+当前时间>要求时间则减去、搜索方向为先左上再右下。

    代码:

     1 #include<cstdio>
     2 const int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
     3 int n,m,t,i,j,b,e,a[9][9];
     4 char s[9];
     5 
     6 int abs(int x) { return x>0?x:-x; }
     7 
     8 bool dfs(int x,int y,int k)
     9 {
    10     if (k==t)
    11     {
    12         if (x==b && y==e) return 1;
    13         return 0;
    14     }
    15     if (abs(x-b)+abs(y-e)+k>t) return 0;
    16     for (int i=0,p,q;i<4;++i)
    17         if (a[p=x+dx[i]][q=y+dy[i]])
    18         {
    19             a[p][q]=0;
    20             if (dfs(p,q,k+1)) return 1;
    21             a[p][q]=1;
    22         }
    23     return 0;
    24 }
    25 
    26 int main()
    27 {
    28     for (scanf("%d%d%d",&n,&m,&t);n && m && t;scanf("%d%d%d",&n,&m,&t))
    29     {
    30         for (i=1;i<n+2;++i)
    31             for (j=1;j<m+2;++j) a[i][j]=0;
    32         for (i=1;i<=n;++i)
    33         {
    34             scanf("%s",s+1);
    35             for (j=1;j<=m;++j)
    36                 if (s[j]!='H')
    37                 {
    38                     if (s[j]=='D') b=i,e=j;
    39                     a[i][j]=1;
    40                 }
    41         }
    42         if ((((b+e)&1)==(t&1)) && dfs(1,1,0)) printf("Yes
    ");
    43         else printf("No
    ");
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    linux Crontab 使用
    彻底搞懂 call() 和 apply() 方法
    (day10) 28. 实现strStr()
    (day9)357. 计算各个位数不同的数字个数
    (day7) 168. Excel表列名称
    (day6) 319. 灯泡开关
    (day5)350 两个数组的交集 II
    (day4)581.最短无序连续子数组
    day3 字符串的排列
    JS类型转换
  • 原文地址:https://www.cnblogs.com/HHshy/p/6065314.html
Copyright © 2011-2022 走看看