题目链接


一.题目内容

一个r行c列的矩阵,里面只有1-9的数字和‘#’,最开始可以随意挑选一个数字然后可以上下左右移动,问所走的路径所含数字最大为多少。

样例解释

input
3 7
##9784#
##123##
##45###

output
791452384


二.解题思路

很明显是个搜索题,虽然数据很小,但是dfs暴力还是会TLE,所以要想办法剪枝。
只dfs的话未搜索到尽头时无法判断最后所得结果是否可行,导致没有中途return的条件。
所以要来一次结果预判,首先可以判断接下来可能到达的数字个数,也就是dfs到某个点,再bfs一次得出可能到达的数字个数,然后还可以进一步对其进行一个降序排序,让其结果最大,然后将bfs可能得到的最大结果加上dfs已经得到的结果相结合,再与当前答案相比,若预判的最大结果还比答案小,则返回,完成剪枝。

结果判断可以用字符串相比,字符串长度相等时直接比较字典序即可,长度不同时直接判断长度大小即可

三.解题代码

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include<queue>
#include<map>
#include<stack>
#include<deque>
#include<list>
#include<set>
#include<iomanip>
#include<sstream>
#include<bitset>
#include<cctype>
#include<sstream>
//#include<strstream>
//#include<unordered_map>
#include<bits/stdc++.h>
using namespace std;
#define Case(x) printf("Case %d:",x)
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define rrep(i,l,r) for(int i=l;i>=r;--i)
#define memo(a) memset(a,0,sizeof(a))
#define out(x) cout<<(x)<<endl
#define sync ios::sync_with_stdio(false);
#define int long long
#define pa pair<int,int>
#define mkp make_pair
//const int MM=LLONG_MAX;
int dir[4][2]= {{-1,0},{0,-1},{1,0},{0,1}};
const int N=1e6+10,M=1e9+7;
//-----------//
int n,m;
int vis[50][50],vis2[50][50];
string a[50],ans;
bool check(int x,int y) {return x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y]&&a[x][y]!='#';
}
string bfs(int x,int y) {string res="";queue<pa>q;q.push({x,y});memo(vis2);while(q.size()) {pa cur=q.front();q.pop();res+=a[cur.first][cur.second];rep(i,0,3) {int xx=cur.first+dir[i][0];int yy=cur.second+dir[i][1];if(check(xx,yy)&&!vis2[xx][yy]) {vis2[xx][yy]=1;q.push({xx,yy});}}}sort(res.begin(),res.end(),greater<int>());return res;
}
void dfs(int x,int y,string res){string temp=res+bfs(x,y);if(temp.size()<ans.size()||(temp.size()==ans.size()&&temp<ans)) return;res+=a[x][y];if(res.size()==ans.size()) ans=max(ans,res);else if(res.size()>ans.size()) ans=res;rep(i,0,3) {int xx=x+dir[i][0];int yy=y+dir[i][1];if(check(xx,yy)) {vis[xx][yy]=1;dfs(xx,yy,res);vis[xx][yy]=0;}}
}
signed main() {sync;while(cin>>n>>m&&n+m) {rep(i,1,n) {cin>>a[i];a[i]="0"+a[i];}ans="";rep(i,1,n) rep(j,1,m) if(a[i][j]!='#') {vis[i][j]=1;dfs(i,j,"");vis[i][j]=0;}out(ans);}
}

四.小结

这类的搜索题,预判剪枝的时候要利用贪心思想达到效果最大化。

2010年湖南省第六届大学生程序设计大赛 F题 “Biggest Number” CSG - 1051 // UVA 11882 (dfs+bfs+剪枝)相关推荐

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

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

  2. 湖南省第八届大学生程序设计大赛原题 D - 平方根大搜索 UVA 12505 - Searching in sqrt(n)...

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30746#problem/D D - 平方根大搜索 UVA12505 - Searchin ...

  3. 重庆市第九届大学生程序设计大赛Day1.题D代码

    ~~第一天的比赛结束了.比赛期间没勘误出来的题目回寝肝了好久才完成. 回头仔细想想,这么简单的题目,我没AC全是因为各种细节上的处理不到位啊! 果然还是平时练习的太少啦!cay嘤嘤嘤嘤嘤嘤嘤嘤嘤 另: ...

  4. 湖南省第六届大学生计算机程序设计竞赛---弟弟的作业

    1007: 弟弟的作业 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 3 [提交][状态][讨论版] 题目描述 你的弟弟刚做完了"100以内数的加减法" ...

  5. 怀化学院计算机设计大赛报名系统,怀化学院六十周年校庆第十一届大学生计算机程序设计竞赛暨2018年湖南省第十四届大学生程序设计大赛选拔赛成功举办...

    原标题:怀化学院六十周年校庆第十一届大学生计算机程序设计竞赛暨2018年湖南省第十四届大学生程序设计大赛选拔赛成功举办 比赛 信息 1 比赛名称:怀化学院六十周年校庆第十一届大学生计算机程序设计竞赛暨 ...

  6. 怀化学院计算机科学张显老师,怀化学院第十二届大学生计算机程序设计竞赛暨2019年湖南省第十五届大学生程序设计大赛选拔赛完美落幕...

    原标题:怀化学院第十二届大学生计算机程序设计竞赛暨2019年湖南省第十五届大学生程序设计大赛选拔赛完美落幕 2019年6月9日,由我校教务处主办,计算机科学与工程学院.怀化学院ACM协会承办的怀化学院 ...

  7. 湖南省第六届大学生计算机程序设计竞赛---数字整除

    1008: 数字整除 时间限制: 1 Sec  内存限制: 128 MB 提交: 6  解决: 4 [提交][状态][讨论版] 题目描写叙述 定理:把一个至少两位的正整数的个位数字去掉.再从余下的数中 ...

  8. 湖南省第六届大学生计算机程序设计竞赛 弟弟的作业

    你的弟弟刚做完了"100以内数的加减法"这部分的作业,请你帮他检查一下.每道题目(包括弟弟的答案)的格式为a+b=c或者a-b=c,其中a和b是作业中给出的,均为不超过100的非负 ...

  9. 河南省第六届大学生程序设计竞赛——外星人的供给站

    外星人的供给站 题目描述 外星人指的是地球以外的智慧生命.外星人长的是不是与地球上的人一样并不重要,但起码应该符合我们目前对生命基本形式的认识.比如,我们所知的任何生命都离不开液态水,并且都是基于化学 ...

最新文章

  1. Bzoj4503 两个串
  2. python打包exe报错_python 程序打包为 windows 可执行程序 exe
  3. 收藏老外的jquery web 按钮插件
  4. oracle-单行函数
  5. springMvc 注解@JsonFormat 日期格式化
  6. java jvm虚拟机_Java虚拟机(JVM)简介
  7. 时间转化_Excel常见时间日期函数全讲解,10个函数教你如何进行日期转化
  8. Windows Server Version 1709 管理之入门篇 1
  9. oracle目录解析,Oracle目录分析与比较
  10. Python中用format函数格式化字符串的用法(2.7版本讲解哦!)
  11. docker限制容器日志大小
  12. Win7安装IIS出错,总是提示“出现错误。并非所有的功能被成功更改。”
  13. 论文翻译(二) CRNN 基于图像序列的识别的识别的端到端可训练神经网络及其在场景文字识别的应用
  14. 如何给图片加水印?分享怎么给图片加水印的方法
  15. 云会议玩法升级:从免费午餐到高价值付费
  16. 手机蓝牙音响音质测试软件,为手机提升音质 MIFA便携蓝牙音响实测
  17. python设计编程体验中心_树莓派DIY体验中心创业计划书
  18. c语言字母转换数字代码,实现c语言中字符串和数字的相互转换的代码
  19. linux 学习笔记 (二)
  20. 轻量级浏览器NetSurf学习(九)-- 如何基于NetSurf打造自己的浏览器

热门文章

  1. 常见GPU卡精度支持一览表
  2. 无人机三维路径规划:杨氏双缝实验优化算法(Young’s double-slit experiment optimizer,YDSE)提供MATLAB代码
  3. 学无止境,今天只是个开始
  4. ceph源码分析--monitor的lease机制
  5. matplotlib.pyplot / plt trick
  6. celery beat KeyError scheduler
  7. 转载:二级语法总结190
  8. 前台项目20鼠标移入背景颜色改变
  9. PMP知识点总结—挣值管理(Earned Value Management,EVM)
  10. 解决灰鸽子变种、Rootkit.Win32.Vanti、Win32.Delf、Win32.Small等