题意

给出如图案例,要你从某一点开始走,一直走到极限(即无法再进行扩展),这时你走过的点会连成一个数,不同的走法当然会有不同的数,要求是输出最大的数(注意每个方块走过一次就不能再走)

思路

•1.枚举所有的点作为起点,然后求从这个点所能得到的最大数
•2.然后是使用DFS求从某一点可以到达的最大数
可是仅仅使用DFS是会超时的,

所以,需要优化剪枝

Dfs的过程就是构建和遍历解答树的过程,在进行深度优先搜索时有一些分叉是可以判断出无需遍历的,这时就可以把这一部分跳过,continue掉

剪枝: 首先一个数它与另一个数最大的区别在于长度,即使它是最大的二位数,我是最小的三位数,我依然大于它,因此可以使用BFS,使用它去判断从这一点所能到达的最大长度,如果这个长度小于我之前所保留的最大长度,那么就不用再搜了,直接跳过。

还有一种情况,就是BFS出来的数长度和之前所保留的最大数长度相等呢?既然已经使用BFS做搜索预判,那么就不如在记录好从那一点所到达的最长距离所形成的数记录下来。然后比较这个数和保留的最大数,如果它小,那就甭走这走一步了

#include"iostream"
#include"cstring"
#include"queue"
#include"ctype.h"
#include"algorithm"
using namespace std; char a[][];
int can[];
int book[][];
int book2[][];
int m,n;
int nex[][]= {{,},{,},{-,},{,-}};
int tx,ty; bool cmp(int a,int b)
{
return a>b;
} typedef struct Node
{
int no[], len;
void Init()
{
len = ;
}
bool operator < (const Node &rhs) const
{
if(len != rhs.len) return len < rhs.len;
for(int i = ; i < len; ++i)
if(no[i] != rhs.no[i]) return no[i] < rhs.no[i];
return false;
}
} Node; Node ans,now; int bfs(int x,int y)
{
queue<int> que;
que.push(x * + y);
int f = ;
can[] = a[x][y] - '';
memset(book2, , sizeof(book2));
book2[x][y] = ;
while(!que.empty())
{
int tmp = que.front();
que.pop();
int nx = tmp /, ny = tmp % ;
for(int i = ; i < ; ++i)
{
int px = nx + nex[i][], py = ny + nex[i][];
if(!isdigit(a[px][py]) || book[px][py] || book2[px][py]) continue;
book2[px][py] = ;
can[f++] = a[px][py] - '';
que.push(px * + py);
}
}
return f;
} void dfs(int x,int y)
{
now.no[now.len++] = a[x][y] - '';
book[x][y] = ;
for(int i = ; i < ; ++i)
{
int px = x +nex[i][], py = y + nex[i][];
if(!isdigit(a[px][py]) || book[px][py]) continue;
int wantlen = bfs(px, py);
if(now.len + wantlen < ans.len) continue;
if(now.len + wantlen == ans.len)
{
sort(can, can + wantlen);
Node tmp = now;
for(int i = wantlen - ; i >= ; --i) tmp.no[tmp.len++] = can[i];
if(tmp < ans) continue;
}
dfs(px, py);
}
if(ans < now) ans = now;
--now.len;
book[x][y] = false;
} int main()
{
while(cin>>m>>n&&m)
{
memset(a,,sizeof(a));
memset(book,,sizeof(book));
for(int i=; i<m; i++) scanf("%s",a[i]);
ans.Init();
now.Init();
for(int j=; j<m; j++)
for(int k=; k<n; k++)
if(isdigit(a[j][k])) dfs(j,k); for(int kk=; kk<ans.len; kk++) cout<<ans.no[kk];
cout<<endl;
}
return ;
}

第七章习题G题的更多相关文章

  1. C和指针 第七章 习题

    7.1 hermite递归函数 int hermite(int n, int x) { if (n <= 0) { return 1; } if (n == 1) { return 2 * x; ...

  2. C和指针第七章第五题

    实现一个简化的printf函数,能够处理%d,%f,%s,%c等格式. /*************************************************************** ...

  3. Learning Perl 第六章习题第一题

    按照first name找last name 知识点: 1. hash的使用和初始化 2. 使用exists函数检测hash中的键是否存在

  4. Learning Perl 第九章习题第二题

    把输入文件中的所有Fred换成Larry, 不区分大小写. 知识点 1. 文本文件读写 2. 简单的正则替换 3. unless 的用法 4. $_ 的用法

  5. Perl语言入门:第七章习题:输出文件中包含一个大写字母的所有行,不输出一行的内容全是大写的

    文件内容: bash-2.03$ cat file_4_ex_ch7.txt anonymous attribute demolition grammar rules indices refernce ...

  6. java编程思想第四版第七章习题

    (略) (略) (略) (略) 创建两个带有默认构造器(空参数列表)的类A和类B.从A中继承产生一个名为C的新,并在C内创建一个B类的成员.不要给C编写构造器.创建一个C类的对象并观察其结果. pac ...

  7. PythonCrashCourse 第七章习题

    编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息,如"Let me see if I can find you a Subaru" car =input("Wha ...

  8. 视觉slam十四讲第七章课后习题6

    版权声明:本文为博主原创文章,转载请注明出处: http://www.cnblogs.com/newneul/p/8545450.html 6.在PnP优化中,将第一个相机的观测也考虑进来,程序应如何 ...

  9. 视觉slam十四讲第七章课后习题7

    版权声明:本文为博主原创文章,转载请注明出处:http://www.cnblogs.com/newneul/p/8544369.html  7.题目要求:在ICP程序中,将空间点也作为优化变量考虑进来 ...

随机推荐

  1. Spring的事务传播性与隔离级别以及实现事物回滚

    一.事务的四个特性(ACID) 原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做. 一致性(Consistency): 数据不会因为事务的执行而 ...

  2. javascript---DOM大编程2

    编程挑战 现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图: 文字素材: 房产: 275万购昌平邻铁三居 总价20万买一居    200万内购五环三居 140万安家东三环 ...

  3. mariadb+centos7+主从复制

    MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的 ...

  4. Poj 2594 Treasure Exploration (最小边覆盖+传递闭包)

    题目链接: Poj 2594 Treasure Exploration 题目描述: 在外星上有n个点需要机器人去探险,有m条单向路径.问至少需要几个机器人才能遍历完所有的点,一个点可以被多个机器人经过 ...

  5. LightOj 1236 Pairs Forming LCM (素数筛选&&唯一分解定理)

    题目大意: 有一个数n,满足lcm(i,j)==n并且i<=j时,(i,j)有多少种情况? 解题思路: n可以表示为:n=p1^x1*p2^x1.....pk^xk. 假设lcm(a,b) == ...

  6. 如何成为一名优秀的 iOS 开发工程师

    如果你是一位专业的iOS开发工程师,你应该为自己感到自豪.因为你能在强大的iOS系统下,一展身手实现自己和他人的想法,这是一件令人无比激动的事情. 作为一名iOS开发工程师,你一定想成为行业的佼佼者. ...

  7. filter 过滤器加载流程

    过滤器例子 <!--A过滤器--><filter> <filter-name>mdamptRightLimitFilter</filter-name> ...

  8. H.264学习笔记5——熵编码之CAVLC

    H.264中,4x4的像素块经过变换和量化之后,低频信号集中在左上角,大量高频信号集中在右下角.左边的低频信号相对数值较大,而右下角的大量高频信号都被量化成0.1和-1:变换量化后的残差信息有一定的统 ...

  9. Struts1 MVC框架的工作原理

    MVC英文及Model-View-Controller,分别是模型(Model),视图(View)和控制(Controller).MVC模式的目的是实现web系统的职能分工. View:即用户交互界面 ...

  10. 浅谈2015新版 U-Boot

    过了挺长一断时间没有看U-BOOT了,这两天下载了新版的UBOOT源码(之前看的一些书都是基于早好多年的源码来讲述,总感觉心里有点不对劲,也许是我比较喜新的原因吧,不过小弟我并没有厌旧哈),好了不多扯 ...