第七章习题G题

题意
给出如图案例,要你从某一点开始走,一直走到极限(即无法再进行扩展),这时你走过的点会连成一个数,不同的走法当然会有不同的数,要求是输出最大的数(注意每个方块走过一次就不能再走)
思路
所以,需要优化剪枝
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题的更多相关文章
- C和指针 第七章 习题
7.1 hermite递归函数 int hermite(int n, int x) { if (n <= 0) { return 1; } if (n == 1) { return 2 * x; ...
- C和指针第七章第五题
实现一个简化的printf函数,能够处理%d,%f,%s,%c等格式. /*************************************************************** ...
- Learning Perl 第六章习题第一题
按照first name找last name 知识点: 1. hash的使用和初始化 2. 使用exists函数检测hash中的键是否存在
- Learning Perl 第九章习题第二题
把输入文件中的所有Fred换成Larry, 不区分大小写. 知识点 1. 文本文件读写 2. 简单的正则替换 3. unless 的用法 4. $_ 的用法
- Perl语言入门:第七章习题:输出文件中包含一个大写字母的所有行,不输出一行的内容全是大写的
文件内容: bash-2.03$ cat file_4_ex_ch7.txt anonymous attribute demolition grammar rules indices refernce ...
- java编程思想第四版第七章习题
(略) (略) (略) (略) 创建两个带有默认构造器(空参数列表)的类A和类B.从A中继承产生一个名为C的新,并在C内创建一个B类的成员.不要给C编写构造器.创建一个C类的对象并观察其结果. pac ...
- PythonCrashCourse 第七章习题
编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息,如"Let me see if I can find you a Subaru" car =input("Wha ...
- 视觉slam十四讲第七章课后习题6
版权声明:本文为博主原创文章,转载请注明出处: http://www.cnblogs.com/newneul/p/8545450.html 6.在PnP优化中,将第一个相机的观测也考虑进来,程序应如何 ...
- 视觉slam十四讲第七章课后习题7
版权声明:本文为博主原创文章,转载请注明出处:http://www.cnblogs.com/newneul/p/8544369.html 7.题目要求:在ICP程序中,将空间点也作为优化变量考虑进来 ...
随机推荐
- 【底层原理】高级开发必须懂的"字节对齐"
认识字节对齐之前,假定int(4Byte),char(1Byte),short(2Byte) 认识字节对齐 先看段代码: struct Data1 { char a; int b; short c; ...
- 《windows核心编程系列》十五谈谈windows线程栈
谈谈windows线程栈. 当系统创建线程时会为线程预订一块地址空间区域,注意仅仅是预订.默认情况下预定的这块区域的大小是1MB,虽然预订这么多,但是系统并不会给全部区域调拨物理存储器.默认情况下,仅 ...
- 题解报告:hdu 1235 统计同成绩学生人数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1235 Problem Description 读入N名学生的成绩,将获得某一给定分数的学生人数输出. ...
- ACM_跳坑小能手(暴力)
跳坑小能手 Time Limit: 2000/1000ms (Java/Others) Problem Description: GDUFE-GAME现场有一个游戏场地人头窜动,围观参与游戏的学生在场 ...
- iOS 画环形图
由于新项目的的需求,需要画环形图,由于以前都没接触过这一类(我是菜鸟),去cocochina山找到了一个案例,个人觉得还可以,分享一下 github 地址https://github.com/zhou ...
- 机器学习-随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )
梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正. 下面的h(x)是要拟 ...
- spark源码编译,运行example遇到:NoClassDefFoundError: org/spark_project/guava/cache/CacheLoader
基本环境: win10+idea Scala2.11.8 maven3.5.3 spark2.1.0 问题: 在window10下编译spark2.1.0源码,在idea下运行example,遇到问题 ...
- 黑马程序员----java基础:多线程
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ---- ...
- JavaScript——分页
- 说说windows10自带浏览器Edge的好与不好
用了10几个月了,正式版也升级了,今天来说说微软自带浏览器microsoft Edge的好与不好 先说好的吧 一,浏览器速度非常快,无论是打开还是关闭,或者是语音助手小娜需要调动浏 ...