题目

题目

 


 

分析

典型搜索,考虑剪枝。

统计一下联通分量。

  • 1、本位置能够达到所有的点的数量加上本已有的点,还没有之前的结果长,直接返回。

  • 2、当本位置能够达到所有的点的数量加上本已有的点与之前的结果一样长,就把联通分量里的点从大到小排序。如果这样都比Ans小,那么直接返回。

前两种是大多人用的,这两个剪枝有了,AC不是问题。

  • 3、如果本图没有障碍物,那么意味着所有点联通,那么结果必定是从整张图的最大值出发的,非最大值,就不用考虑了。

    这个是我自己想的,大约能剪 40-80 ms。

个人觉得本题较坑,一开始我判联通分量用的是dfs,疯狂Tle。。。改成bfs 460ms。再瞎搞剪到400ms。

这个速度不算快,我觉得是我常数太大了,或者写法不太好。

 


 

代码

  1. #include <cstring>
  2. #include <queue>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <algorithm>
  6. using namespace std;
  7. int r,c,L,num;
  8. int vis[33][33],vis2[33][33];
  9. int dx[5]={1,-1,0,0},dy[5]={0,0,1,-1};
  10. vector<char> Ans,v;
  11. char map[33][33];
  12. bool cmp(int x,int y){ return x>y; }
  13. bool in(int x,int y)
  14. {
  15. if(x>=0 && x<r && y>=0 && y<c) return true;
  16. return false;
  17. }
  18. void GetNum(int sx,int sy)
  19. {
  20. memset(vis2,0,sizeof(vis2)); v.clear();
  21. queue<int> q;
  22. q.push(sx*33+sy);
  23. while(!q.empty())
  24. {
  25. int m=q.front(); q.pop();
  26. int x=m/33,y=m%33;
  27. for(int i=0;i<4;i++)
  28. {
  29. int px=x+dx[i],py=y+dy[i];
  30. if(in(px,py) && map[px][py]!='#' && !vis[px][py] && !vis2[px][py])
  31. {
  32. v.push_back(map[px][py]);
  33. vis2[px][py]=1;
  34. q.push(px*33+py);
  35. }
  36. }
  37. }
  38. L=v.size();
  39. }
  40. int small(vector<char> a,vector<char> b)
  41. {
  42. for(int i=0;i<min(a.size(),b.size());i++)
  43. {
  44. if(a[i] < b[i]) return 1;
  45. if(a[i] > b[i]) return 0;
  46. }
  47. return 2;
  48. }
  49. void dfs(int x,int y,vector<char> S)
  50. {
  51. if(((small(S,Ans)==0 && S.size() == Ans.size()) && S.size()) || S.size() > Ans.size()) Ans=S;
  52. GetNum(x,y);
  53. if(S.size() + L < Ans.size()) return;
  54. if(S.size() + L == Ans.size())
  55. {
  56. int q=small(S,Ans);
  57. if(q==1) return;
  58. if(q==0) goto l1;
  59. sort(v.begin(),v.end(),cmp);
  60. int f=0;
  61. for(int i=0;i<L;i++)
  62. {
  63. if(v[i] < Ans[i+S.size()])
  64. {
  65. f=1; break;
  66. }
  67. if(v[i] > Ans[i+S.size()]) break;
  68. }
  69. if(f==1) return;
  70. }
  71. l1: for(int i=0;i<4;i++)
  72. {
  73. int px=x+dx[i],py=y+dy[i];
  74. if(in(px,py) && map[px][py]!='#' && !vis[px][py])
  75. {
  76. vis[px][py]=1; S.push_back(map[px][py]);
  77. dfs(px,py,S);
  78. vis[px][py]=0; S.pop_back();
  79. }
  80. }
  81. }
  82. int main()
  83. {
  84. while(scanf("%d%d",&r,&c)==2 && r && c)
  85. {
  86. int num=0,maxnum=-1;
  87. Ans.clear(); v.clear();
  88. memset(vis,0,sizeof(vis));
  89. for(int i=0;i<r;i++)
  90. {
  91. scanf("%s",map[i]);
  92. for(int j=0;j<c;j++)
  93. if(map[i][j]=='#') num++;
  94. else maxnum=max(maxnum,map[i][j]-'0');
  95. }
  96. for(int i=0;i<r;i++)
  97. {
  98. for(int j=0;j<c;j++)
  99. {
  100. vector<char> S;
  101. if(map[i][j]!='#')
  102. {
  103. if(num==0 ) if(map[i][j]<maxnum+'0') continue;
  104. vis[i][j]=1; S.push_back(map[i][j]);
  105. dfs(i,j,S);
  106. vis[i][j]=0;
  107. }
  108. }
  109. }
  110. for(int i=0;i<Ans.size();i++)
  111. printf("%c",Ans[i]);
  112. puts("");
  113. }
  114. return 0;
  115. }

【UVa】11882 Biggest Number(dfs+剪枝)的更多相关文章

  1. UVA - 11882 Biggest Number(dfs+bfs+强剪枝)

    题目大意:给出一个方格矩阵,矩阵中有数字0~9,任选一个格子为起点,将走过的数字连起来构成一个数,找出最大的那个数,每个格子只能走一次. 题目分析:DFS.剪枝方案:在当前的处境下,找出所有还能到达的 ...

  2. UVA 11882 Biggest Number(搜索+剪枝)

    You have a maze with obstacles and non-zero digits in it: You can start from any square, walk in the ...

  3. 湖南省第六届省赛题 Biggest Number (dfs+bfs,好题)

    Biggest Number 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 You have a maze with obstacles and non-zero di ...

  4. UVa 208 消防车(dfs+剪枝)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. UVA 140 Bandwidth (dfs 剪枝 映射)

    题意: 给定一个n个结点的图G和一个结点的排列, 定义结点i的带宽b(i)为i和相邻结点在排列中的最远距离, 所有b(i)的最大值就是这个图的带宽, 给定G, 求让带宽最小的结点排列. 给定的图 n ...

  6. UVA11882-Biggest Number(DFS+最优化剪枝)

    Problem UVA11882-Biggest Number Accept: 177    Submit: 3117Time Limit: 1000 mSec    Memory Limit : 1 ...

  7. Sticks(UVA - 307)【DFS+剪枝】

    Sticks(UVA - 307) 题目链接 算法 DFS+剪枝 1.这道题题意就是说原本有一些等长的木棍,后来把它们切割,切割成一个个最长为50单位长度的小木棍,现在想让你把它们组合成一个个等长的大 ...

  8. 湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)

    Biggest Number http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30851#problem/F 解题思路:DFS(检索)+BF ...

  9. 湖南省第6届程序大赛第6题 Biggest Number

    Problem F Biggest Number You have a maze with obstacles and non-zero digits in it: You can start fro ...

随机推荐

  1. 【剑指offer】包含min函数的栈,C++实现

    博客文章索引地址 博客文章中代码的github地址 1.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.在该栈中调用push.pop.top.min的时间复杂度都是o(1) ...

  2. 【pandas】pandas.Series.str.split()---字符串分割

    原创博文,转载请注明出处! 本文代码的github地址       series中的元素均为字符串时,通过str.split可将字符串按指定的分隔符拆分成若干列的形式. 例子: 拆分以逗号为分隔符的字 ...

  3. BZOJ2243 SDOI2011 染色 【树链剖分】

    BZOJ2243 SDOI2011 染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色 ...

  4. Could not transfer artifact org.springframework:spring-tx:jar:3.2.3.RELEASE

    在maven中加入依赖时,如果jar下载失败,这时pom文件中就会出现上面的错误,重新添加也不好用, 这时要手动去maven库中删除已经下载的依赖包. 默认库位置:C:\Users\XXX\.m2

  5. 【java基础】java集合系列之HashMap

    Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论. 1.hashma ...

  6. python绘图踩的坑

    踩的坑 pyecharts安装地图包 pip install echarts-countries-pypkg 报错Unknown or unsupported command 'install' 这可 ...

  7. 关于时间戳和QDateTime相互转换的有关问题(转)

    1.toTime_t()把2014年12月19日10:24:40这样的QDateTime的格式转变为1418955940这样的时间戳 QDateTime time = QDateTime::curre ...

  8. linux CentOS 安装rz和sz命令 lrzsz

    lrzsz在linux里可代替ftp上传和下载. lrzsz 官网入口:http://freecode.com/projects/lrzsz/ lrzsz是一个unix通信套件提供的X,Y,和ZMod ...

  9. win7怎么安装和启动 jboss

    本文以JBoss Application Server 4.2.1 GA(以下简称JBoss)为例,介绍它在Windows平台上的启动过程.为了方便叙述,对平台环境做以下假定:Java运行时的安装路径 ...

  10. RK3288 添加USB转虚拟串口设备

    在系统开启并有日志打印的前提下,插入USB设备,就会打印USB设备和虚拟串口信息. 打印信息如下: 供应商ID(VID):idVendor=1234,产品ID(PID): idProduct=5678 ...