题意:

             给你起点,终点,图上有墙有路还有宝物,问你在规定时间内能否能到终点,如果能问最多能捡到多少宝物.


思路:

          看完这个题目果断 BFS+三维的mark[][][] 第三维用二进制压缩的思想去解决,结果TLE了,我后来在网上看了看,发现有人用二进制压缩ac了,这更坚定了我的决心啊,不停的优化 超时 优化 超时 就这样我超时了 50多次,我tm恶心了,直接粘了个网上说和我想法一样的代码交上去了,结果 TLE 了, 我 fuck ,超时了早说啊... ,可能是数据加强了.

下面说一下正解 ,观察我们发现,题目中给的宝贝数量并不多,最多才10 ,其实我们可以先 BFS求出所有点的最短路,这些点包括 ,起点,终点,宝物,求完最短路我们其实就把这个图压缩成了最多 10 + 1 + 1 个点,压缩了图之后就是暴力DFS了,12个点压力也有点大,所以要剪枝 , 在深搜的时候如果发现当前的可满足ans 已经等于宝物总和了,那么不用在搜了,直接return 到最外面,或者可以再加上一个就是,当前的所用时间 + 当前到终点的时间
大于题目给的时间限制了,直接return 到上一层; 



/*

先BFS把图压缩,在DFS爆搜

*/

#include<stdio.h>

#include<string.h>

#include<queue>

#define N1 60

#define N2 15 

using namespace std;

typedef struct

{

   int x ,y ,t;

}NODE;

NODE xin ,tou;

int mark_bfs[N1][N1] ,mark_dfs[N2];

int dis[N2][N2] ,money[N2];

int dir[4][2] = {0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0};

char map[N1][N1];

int xx ,yy ,tt ,mm ,ss ,nn;

bool ok(int x ,int y)

{

   if(x >= 0 && x < xx && y >= 0 && y < yy && map[x][y] != '*' && !mark_bfs[x][y])

   return 1;

   return 0;

}

void BFS(int x ,int y ,int key)// 求那几个点之间的最短路,key当前是起始点.

{

   memset(mark_bfs ,0 ,sizeof(mark_bfs));

   mark_bfs[x][y] = 1;

   xin.x = x ,xin.y = y ,xin.t = 0;

   queue<NODE>q;

   q.push(xin);

   while(!q.empty())

   {

      tou = q.front();

      q.pop();

      for(int i = 0 ;i < 4 ;i ++)

      {

         xin.x = tou.x + dir[i][0];

         xin.y = tou.y + dir[i][1];

         xin.t = tou.t + 1;

         if(ok(xin.x ,xin.y))

         {

            mark_bfs[xin.x][xin.y] = 1;

            q.push(xin);

            if(map[xin.x][xin.y] == '@')

            dis[key][0] = xin.t;

            if(map[xin.x][xin.y] == '<')

            dis[key][nn+1] = xin.t;

            if(map[xin.x][xin.y] >= 'A' && map[xin.x][xin.y] <= 'J')

            dis[key][map[xin.x][xin.y] - 64] = xin.t;

         }

      }

   }

   return ;

}

void DFS(int s ,int time ,int mon) // s是当前点 ,time是当前所用时间,mon是当前财

//富值

{

   if(time > tt || mm == ss) return;

   if(s == nn + 1 && mm < mon)

   mm = mon;

   for(int k = 1 ;k <= nn + 1 ;k ++)

   {

      if(!dis[s][k] || mark_dfs[k]) continue;

      mark_dfs[k] = 1;

      DFS(k ,time + dis[s][k] ,mon + money[k]);

      mark_dfs[k] = 0;

   }

}

int main ()

{

   int i ,j ,t ,cas = 1;

   scanf("%d" ,&t);

   while(t--)

   {

      scanf("%d %d %d %d" ,&yy ,&xx ,&tt ,&nn);

      money[0] = money[nn+1] = 0;

      for(ss = 0 ,i = 1 ;i <= nn ;i ++)

      {

         scanf("%d" ,&money[i]);

         ss += money[i];

      }

      for(i = 0 ;i < xx ;i ++)

      scanf("%s" ,map[i]);

      memset(dis ,0 ,sizeof(dis));

      for(i = 0 ;i < xx ;i ++)

      for(j = 0 ;j < yy ;j ++)

      {

         // 起点是 0 ,终点是 n + 1 ,宝物是 1 ---- n其他的墙和路都不要了,深搜时没有用

         if(map[i][j] == '*')

         continue;

         if(map[i][j] == '@')

         BFS(i ,j ,0);

         if(map[i][j] == '<')

         BFS(i ,j ,nn + 1);

         if(map[i][j] >= 'A' && map[i][j] <= 'J')

         BFS(i ,j ,map[i][j] - 64);

      }

      mm = -1;

      memset(mark_dfs ,0 ,sizeof(mark_dfs));

      mark_dfs[0] = 1;

      DFS(0 ,0 ,0);

      printf("Case %d:\n" ,cas ++);

      if(mm == -1)

      printf("Impossible\n");

      else

      printf("The best score is %d.\n" ,mm);

      if(t) printf("\n");

   }

   return 0;

}

   

      

      

hdu 1044 BFS(压缩图)+DFS的更多相关文章

  1. hdu 1044(bfs+dfs+剪枝)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  2. HDU 1983 BFS&amp;&amp;DFS

    大多数刚需封锁4区域可以,DFS地区封锁.BFS无论是通过 #include "stdio.h" #include "string.h" #include &q ...

  3. hdu 1044(bfs+状压)

    非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  4. HDU 1044 BFS

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. HDU 1044 Collect More Jewels(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  6. 列出连通集(DFS及BFS遍历图) -- 数据结构

    题目: 7-1 列出连通集 (30 分) 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递 ...

  7. CF467D Fedor and Essay 建图DFS

      Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...

  8. HDU 1241 Oil Deposits --- 入门DFS

    HDU 1241 题目大意:给定一块油田,求其连通块的数目.上下左右斜对角相邻的@属于同一个连通块. 解题思路:对每一个@进行dfs遍历并标记访问状态,一次dfs可以访问一个连通块,最后统计数量. / ...

  9. hdu 1241 Oil Deposits(DFS求连通块)

    HDU 1241  Oil Deposits L -DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & ...

随机推荐

  1. k8s自定义controller设计与实现

    k8s自定义controller设计与实现 创建CRD 登录可以执行kubectl命令的机器,创建student.yaml apiVersion: apiextensions.k8s.io/v1bet ...

  2. SpineRuntime-Presentation - 基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画

    SpineRuntime-Presentation 基于 spine-libgdx 实现在 AndroidPresentation 上展示 Spine 动画 Github地址 效果 可以在 Andro ...

  3. 剑指 Offer 65. 不用加减乘除做加法 + 位运算

    剑指 Offer 65. 不用加减乘除做加法 Offer_65 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGa ...

  4. 译文《最常见的10种Java异常问题》

    封面:洛小汐 译者:潘潘 知彼知己,方能百战不殆. 前言 本文总结了有关Java异常的十大常见问题. 目录 检查型异常(checked) vs. 非检查型异常(Unchecked) 异常管理的最佳实践 ...

  5. SpringCloud-服务与注册

    SpringCloud- Eureka服务注册与发现 1.概述 springcloud是一个非常优秀的微服务框架,要管理众多的服务,就需要对这些服务进行治理,管理每个服务与每个服务之间的依赖关系,可以 ...

  6. HTB系列之七:Bastard

    出品|MS08067实验室(www.ms08067.com) 这次挑战的是 HTB 的第7台靶机:Bastard 技能收获: PHP Unserilaize CMS Version Identify ...

  7. C# 应用 - 使用 HttpClient 发起上传文件、下载文件请求

    1. 示例代码 using System; using System.IO; using System.Net.Http; /// <summary> /// 下载文件 /// </ ...

  8. WPF 基础 - xaml 语法总结

    Attribute 与 Property 之间的区别 Property 对应着抽象对象身上的性状: Attribute 是针对标签的特征: 往往一个标签具有的 Attribute 对于它所代表的对象的 ...

  9. idea添加本地文件约束(DTD)

    当我们做 xml 文件配置的时候,需要对其进行约束的配置 例如: hibernate 如果我们在联网的情况下是可以不添加配置文件约束的,红框内的 URL 会自动帮我们从网络上加载约束文件,但是没有网络 ...

  10. Java__包机制__用户输入

    包机制 包机制的存在是为了解决当定义了多个类的时候,可能会出现类名重复的问题,包机制的存在可以解决这一冲突. 包的作用 把功能相似的类或者相关接口组织在同一个包里,方便再查找. 包名可以避免名字冲突. ...