题目大意:给出一个方格矩阵,矩阵中有数字0~9,任选一个格子为起点,将走过的数字连起来构成一个数,找出最大的那个数,每个格子只能走一次。

题目分析:DFS。剪枝方案:在当前的处境下,找出所有还能到达的点的个数,若当前数字的长度加上个数仍小于目前最优答案的长度,则剪去;若长度相等,则将所有还能到达的数字按从大到小排序后连到当前数字上,如果还比目前最优解小,则减去。找出所有还能到达的点的过程用BFS实现。

代码如下:

  1. # include<iostream>
  2. # include<cstdio>
  3. # include<queue>
  4. # include<string>
  5. # include<cstring>
  6. # include<algorithm>
  7. using namespace std;
  8. string ans;
  9. int r,c,vis[35][35],mark[35][35],v[1000];
  10. char p[35][35];
  11. int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
  12. bool ok(int x,int y)
  13. {
  14. if(x>=0&&x<r&&y>=0&&y<c)
  15. return true;
  16. return false;
  17. }
  18. bool smaller(string a,string b)
  19. {
  20. if(a.size()<b.size())
  21. return true;
  22. if(a.size()==b.size()&&a<b)
  23. return true;
  24. return false;
  25. }
  26. int bfs(int x,int y)
  27. {
  28. queue<int>q;
  29. memset(mark,0,sizeof(mark));
  30. q.push(x*c+y);
  31. mark[x][y]=1;
  32. int res=0;
  33. while(!q.empty())
  34. {
  35. int u=q.front();
  36. q.pop();
  37. for(int i=0;i<4;++i){
  38. int nx=u/c+d[i][0],ny=(u%c)+d[i][1];
  39. if(ok(nx,ny)&&p[nx][ny]!='#'&&!vis[nx][ny]&&!mark[nx][ny]){
  40. mark[nx][ny]=1;
  41. v[res++]=p[nx][ny]-'0';
  42. q.push(nx*c+ny);
  43. }
  44. }
  45. }
  46. return res;
  47. }
  48. void dfs(int x,int y,string ap)
  49. {
  50. if(smaller(ans,ap))
  51. ans=ap;
  52. else{
  53. int len=bfs(x,y);
  54. if(ap.size()+len<ans.size())
  55. return ;
  56. if(ap.size()+len==ans.size()){
  57. sort(v,v+len);
  58. string app=ap;
  59. for(int i=len-1;i>=0;--i)
  60. app+=char(v[i]+'0');
  61. if(smaller(app,ans))
  62. return ;
  63. }
  64. }
  65. for(int i=0;i<4;++i){
  66. int nx=x+d[i][0],ny=y+d[i][1];
  67. if(ok(nx,ny)&&p[nx][ny]!='#'&&!vis[nx][ny]){
  68. vis[nx][ny]=1;
  69. dfs(nx,ny,ap+p[nx][ny]);
  70. vis[nx][ny]=0;
  71. }
  72. }
  73. }
  74. void solve()
  75. {
  76. for(int i=0;i<r;++i){
  77. for(int j=0;j<c;++j){
  78. if(p[i][j]!='#'){
  79. memset(vis,0,sizeof(vis));
  80. vis[i][j]=1;
  81. string ap="";
  82. ap+=p[i][j];
  83. dfs(i,j,ap);
  84. }
  85. }
  86. }
  87. cout<<ans<<endl;
  88. }
  89. int main()
  90. {
  91. while(scanf("%d%d",&r,&c)&&r+c)
  92. {
  93. ans.clear();
  94. for(int i=0;i<r;++i)
  95. scanf("%s",p[i]);
  96. solve();
  97. }
  98. return 0;
  99. }

  

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】11882 Biggest Number(dfs+剪枝)

    题目 题目     分析 典型搜索,考虑剪枝. 统计一下联通分量. 1.本位置能够达到所有的点的数量加上本已有的点,还没有之前的结果长,直接返回. 2.当本位置能够达到所有的点的数量加上本已有的点与之 ...

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

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

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

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

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

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

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

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

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

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

  10. 湖南省第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. web前端----Bootstrap框架

    Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局,并且 ...

  2. python之路----模块与序列化模块

    认识模块 什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用pyt ...

  3. 开启你的kali linux DIY之旅

    更新源 首先 是kali2016.2更新源的问题,网上找了好久,都不是很满意.后来把kali 2016.2安装到实体机中才发现,里面自带了更新源.下面我把这个官方自带更新源分享出来(速度蛮快的) de ...

  4. Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建

    Zookeeper是一种在分布式系统中被广泛用来作为:分布式状态管理.分布式协调管理.分布式配置管理.和分布式锁服务的集群.kafka增加和减少服务器都会在Zookeeper节点上触发相应的事件kaf ...

  5. read progress

    <GNU+make中文手册-v3.80> 14 跟我一起写 Makefile 8 51单片机及c语言程序开发实例7/20/465

  6. 配置redis, make的时候: zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

    今天正在centos7.3里面配置redis3.0, 结果make的时候抛出编译中断 CC adlist.o In file included from adlist.c:34:0: zmalloc. ...

  7. 20165211 预备作业3 Linux安装与学习

    20165211 预备作业3 Linux安装与学习 1. Linux安装 涉及软件:VirtualBox,Ubuntu 参考教程:基于VirtualBox安装Ubuntu图文教程 安装过程的问题 在安 ...

  8. Python3基础 list remove 删除元素

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. Go第十篇之反射

    反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分.在运行程序时,程序无法获取自身的信息. 支持反射的语言可以在程序编译期将变量 ...

  10. 【第四章】 springboot + swagger

    注:本文参考自 http://www.jianshu.com/p/0465a2b837d2 swagger用于定义API文档. 好处: 前后端分离开发 API文档非常明确 测试的时候不需要再使用URL ...