题意:

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


思路:

          看完这个题目果断 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. [ZJOI2014] 璀璨光华(bfs建图 + dfs搜索)

    problem luogu-P3342 solution 你感觉这道题没考什么,又感觉考了什么 通过样例以及题面,我们并未获取到『立方体每个小方块的编号是按一定规则命名』的信息. 也就是说,我们需要通 ...

  2. HDU 6386 Age of Moyu DFS+BFS

    /** HDU 6386 Age of Moyu DFS+BFS 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6386题意:1-->n的最小换乘次数 ...

  3. 链式前向星模板 建图+dfs+bfs+dijkstra

    边没有用struct封装起来,节点和边的计数起点如果不符合习惯可以稍作修改 建图+DFS+BFS #include <cstdio> #include <cstring> #i ...

  4. 图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)

    邻接表存储的图 - DFS /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visi ...

  5. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)

    Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...

  6. LeetCode 529. 扫雷游戏(广度优先搜索BFS/深度优先搜索DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷, 'E' 代表一个未挖出的空方 ...

  7. 二叉树中进行 BFS 和图中进行 BFS 最大的区别

    二叉树中进行 BFS 和图中进行 BFS 最大的区别 就是二叉树中无需使用 HashSet(C++: unordered_map, Python: dict) 来存储访问过的节点(丢进过 queue ...

  8. BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现

    来源:https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.videocard.0 BFS广度优先算法 graph = {& ...

  9. 图片太大怎么办?压缩图帮你几秒搞定在线图片压缩

    说到图片压缩(https://www.yasuotu.com/),对于经常使用图片的小伙伴们来说一定都不陌生,大家在使用图片的时候难免会遇到图片大小超过限制没法使用的情况,对于一些超过限制不多的图片, ...

最新文章

  1. pcb matrix ipc lp viewer软件中SMN、SMM、SML三个库的区别
  2. ping 监控网络延时
  3. JavaSE之Java基础(1)
  4. 一个编程指南还有这么多道道儿?
  5. 读数据库所有表和表结构的sql语句了(mssql)
  6. bzoj4033 [HAOI2015]树上染色(树形)
  7. python统计excel数据总行数_python 统计excel行数据库
  8. 第二届“马栏山”杯国际音视频算法大赛音乐节拍检测题参赛总结及分享(Rank7)
  9. 利用组策略部署软件——将软件发布给用户
  10. mysql win10 优化设置_Win10电脑优化必做的几个优化技巧提升速度!
  11. nginx常用配置集锦(持续更新中。。。)
  12. 基于SSM的大学生创业众筹平台网站 毕业设计-附源码212000
  13. Flutter第一部分(UI)第二篇:在Flutter中构建布局
  14. 从头开始实现一个小型spring框架——手写Spring之集成Tomcat服务器
  15. 扎拉赞恩 服务器 微信群,wow怀旧服扎拉赞恩任务怎么做-wow怀旧服扎拉赞恩的头颅在哪里-地点位置_牛游戏网...
  16. 使用 ALT 键输入特殊符号
  17. VS语音信号处理(6) C语言调用SoundTouch进行变速不变调工程实例
  18. max3485和max485区别
  19. openfire--好友管理各种状态纠结
  20. 互联网公益进入下半场,为啥2亿人次在支付宝做捐赠?

热门文章

  1. 结构体字节对齐(转)
  2. Struts2笔记——第一个实例HelloWorld
  3. CSS3无前缀脚本prefixfree.js与Animatable使用
  4. C++默认参数与函数重载
  5. 石川es6课程---12、Promise
  6. struts2值栈内部数据结构详解
  7. 《构建之法》阅读笔记2
  8. 连续处理函数reduce
  9. 此blog已经迁移~~~
  10. 我的第一个Windows Phone 7应用程序