第七章习题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程序中,将空间点也作为优化变量考虑进来 ...
随机推荐
- C# Web页面打印网页
<style media=print type="text/css"> .noprint{display:none} </style> 在打印时 ...
- 图论算法->最短路
求最短路算法,有Floyd,dijkstra,Bellmanford,spfa等诸多高级算法.优化方法也是层出不穷. 我们不妨分析一下各算法的使用特点(可能不准确 1.Floyd算法 复杂度O(n³) ...
- 【css】rem及其替换方案
移动端的web前端开发其实经常会有一些令人头疼的问题,比如屏幕适配.1像素问题等,rem也是之前在屏幕适配上比较完善的一套方案,但是随着业务的深入,任何方案都有其优秀与不足的地方,rem这套方案也一样 ...
- _bzoj1051 [HAOI2006]受欢迎的牛【强联通】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1051 保存tarjan模版. 求强联通分量,缩点. #include <cstdio& ...
- Retinex系列之Frankle-McCann Retinex 分类: Matlab 图像处理 2014-12-01 21:52 538人阅读 评论(2) 收藏
一.Frankle-McCann Retinex Frankle-McCann算法选择一条螺旋结构的路径用于像素间的比较.如下图,算法沿着螺旋路径选取用于比较 像素点,这种路径选择包含了整个图像的全局 ...
- 转 PHP抽象类:无法实例化 (不错)
http://blog.csdn.net/kaituozheboke/article/details/52183726 一.抽象类: 无法实例化 类前加 abstract, 此类就成为抽象类,无法实例 ...
- 一命令安装nginx
#!/bin/bash yum -y install wget pcre-devel openssl openssl-devel libtool gcc automake autoconf libto ...
- sed与正则表达式
行的开头(^) ^匹配每一行的开头 [root@sishen ~]# sed -n '/^103/ p ' employee.txt 103,Raj Reddy,Sysadmin 只有^出现在正则表达 ...
- rhel7安装oracle 11gR2
一.修改操作系统核心参数 在Root用户下执行以下步骤: 1)修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/lim ...
- hibernate与struts2整合中出现问题以及一级缓存查询数据在业务层问题
直接上问题: org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: cn.xxx.pojo.Custom ...