uva 11882 C - Biggest Number 【最优性剪枝】【深搜】

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

题意:给定一个n*m的矩阵,'#'表示不能通过,每个方格只能走过一次且下一步只能走上下左右四个方向,问,能够组成最大连续的数字为多大?

思路:最优性剪枝即当前所搜索到的结点的后续最优情况也不比当前最优情况好,就停止对当前结点的搜索,回溯到其父亲结点,搜索其它情况。这里用到了两个剪枝,一个是当前已搜索到的数字长度+后续能搜索到的数字长度小于最优值时,直接剪枝;另一个是长度相等时,判断字典序大小,前者较小时,剪枝,这里需要注意,将后续能够搜索到的数字按从大到小的顺序存入当前数字之后,再和最优值进行比较。

结:这道题自己被坑的比较惨,错在:long long最多能存十进制的19位数,而此题最多为30位,故用long long必然存最优值必然错误;当字典序相等而当前数字+后续搜索到的数字大于等于最优值时,还要继续往下搜索,而不是返回父亲结点,else出错。第一次用string容器,头文件#include<string>,以后使用注意:s.clear()是清空,比较string大小时,保证长度相等才行

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<string>
using namespace std;
const int maxn = 20;
char vis[maxn][maxn],str[maxn];
int book[maxn][maxn],used[maxn][maxn];
int n,m;
int k[4][2]={0,1,0,-1,1,0,-1,0};
string ans;
struct node{
	int x,y;
};
int find(int x,int y)
{
	if(x < 0||x >n-1||y<0||y>m-1)
		return 0;
	return 1;
}
int Judge(int x,int y)//查找能够到达的所有数字 
{
	int i,j,count,nx,ny;
	struct node nowq,nextq;
	queue<node>q;
	for(i = 0; i < n; i ++)
		for(j = 0; j < m; j ++)
			used[i][j] = book[i][j]; 
	count = 0;
	nowq.x = x;
	nowq.y = y;
	q.push(nowq);
	while(!q.empty())
	{
		nowq = q.front();
		q.pop();
		for(i = 0; i < 4; i ++)
		{
			nx = nowq.x + k[i][0];
			ny = nowq.y + k[i][1];
			if(find(nx,ny)&&!used[nx][ny]&&vis[nx][ny]!='#')
			{
				str[count ++] = vis[nx][ny];
				used[nx][ny] = 1;
				nextq.x = nx;
				nextq.y = ny;
				q.push(nextq);
			}
		}
	}
	str[count] = '\0';
	return count;
}
void dfs(int x,int y,string s)
{
	int nx,ny,i,j,length;
	length = Judge(x,y);
	if(s.length() > ans.length()||(s.length() == ans.length()&&s > ans))
		ans = s;//当前数字长度大于最优值or长度相等字典序更大时,更新最优值 
	if(length + s.length() < ans.length())
		return ;//如果当前长度+能够到达数字的长度小于最优长度,则剪枝 
	else if(length+s.length() == ans.length())//如果相等,则比较字典序 
	{
		sort(str,str+length);//将能够到达的值按升序排列 
		string ss = s;
		for(i = length-1; i >= 0; i --)
			ss += str[i];
		if(ss < ans)//如果字典序小于最优值,则剪枝 
			return;
	}
	for(i = 0; i < 4; i ++)
	{
		nx = x + k[i][0];
		ny = y + k[i][1];
		if(find(nx,ny)&&!book[nx][ny]&&vis[nx][ny]!='#')
		{
			book[nx][ny] = 1;
			dfs(nx,ny,s+vis[nx][ny]);
			book[nx][ny] = 0;
		}
	}

	return;
}
void Count()
{
	int i,j;
	string s;
	ans.clear();
	for(i = 0; i < n; i ++)
		for(j = 0; j < m; j ++)
			if(vis[i][j]!='#')
			{
				memset(book,0,sizeof(book));
				book[i][j] = 1;
				s.clear();
				dfs(i,j,s +vis[i][j]);
			}
	return;
}
int main()
{
	int i;
	while(scanf("%d%d",&n,&m),n!=0||m!=0)
	{
		for(i = 0; i < n; i ++)
			scanf("%s",vis[i]);
		Count();
		cout<<ans<<endl;
	}
	return 0;
}

UVa 11882Biggest Number(DFS+剪枝 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=842&page=show_problem&problem=3004 题意:在一个R行C列(2≤R,C≤15,R∗C≤30)(2 \le R, C \le 15, R*C \le 30 )的矩阵里有障碍物和数字格(包含1~9的数字 阅读详情

相关推荐

数据结构与算法之剪枝算法

数据结构与算法之剪枝算法

weixin_47225948的博客 6268

Biggest Number(回溯/bfs/剪枝)

Biggest Number - UVA 11882 - Virtual Judge (vjudge.net)寻找最大的数。dfs(回溯)+剪枝(bfs).由于string的大小比较和本题数字的大小比较类似,所以用string更方便。每一次dfs时要考虑当前节点之后所能串起来的,分为三种情况:1,太少,显然不满足,跳过当前的节点的dfs(剪枝);2,+当前的长度now能跟之前一样长,那就比较ans的子字符串跟当前的now字符串谁大,如果ans大那就没必要继续(剪枝);3,+当前now的长度比ans的长度更长

Crushlikearush的博客 284

《遥感大模型生产级实战:从数据到决策的端到端AI工程》系列第一部分:AI遥感工程师的基础设施与工具链-文章 4:传统遥感分析与机器学习基线

本章将系统性地介绍经典遥感分析工作流,从数据预处理到多维度特征工程,再到如何利用经典的机器学习模型(如随机森林、支持向量机)进行监督与非监督学习。我们将通过一个完整的“智慧农业作物分类”项目实战,展示如何利用我们之前构建的数据湖和工具链,从原始数据到最终的分析结果,构建一个性能可靠、可解释性强的基线系统。更重要的是,我们将入剖析这种传统方法的局限性,从而为后续章节引入遥感大模型的必要性提供强有力的论证。

panshengwu的博客 680

度优先最优性剪枝

对于求最优解的一类问题,通常可以用可行性剪枝,比如再求解迷宫最短路的时候,如果发现当前的步数已经超过了当前的最优解,那么当前状态开始的索都是多余的,因为这样索下去永远都不可能到更优解。通过这样的剪枝,可以省去大量多余的计算。 此外,在索是否有可行解的过程中,一旦找到了一组可行解,后面的索都不必再进行了,这算是最优性剪枝的一个特例。 有一个 n×m 大小的迷宫。其中字符’S’表示起点,字符’T’表示终点,字符’*‘表示墙壁,字符’.‘表示平地。你需要从’S’出发走到’T’,每次只能向上下左右相邻的位

AliceK1008的博客 811

索优化剪枝策略

索的优化剪枝

信息学奥赛学案 1230

11882 - Biggest Number ( )

题目链接:传送门 思路: 以每个数字为起点去,取在过程中到的最大的 数。 注意, 如果只用蛮力去会超时,所以需要剪枝剪枝需要用到广,就是你用到某个点之后,先用广去计算 这个点继续还能遍历所有的数字个数 a,假设现在Biggest Number 长度为 b, 到这个点已经 的数的长度 c: 两种情况: 1. a+c < b 那么这个点...

学习笔记 976

Biggest Number

Description You have a maze with obstacles and non-zero digits in it: You can start from any square, walk in the maze, and finally stop at some square. Each step, you may only walk into one of the four neighbouring squares (up, down, left, right) and you

PushyTao的博客 411

UVA 11882 Biggest Number索+剪枝(dfs+bfs))

题意:在一个R行C列(2≤R,C≤15,R∗C≤30)的矩阵里有障碍物和数字格(包含1~9的数字)。你可以从任意一个数字格出发,每次沿着上下左右之一的方向走一格,但不能走到障碍格中,也不能重复经过一个数字格,然后把沿途经过的所有数字连起来,如图所示。如图可以得到9784,4832145等整数。问:能得到的最大整数是多少?(本段摘自《算法竞赛入门经典(第2版)》) 分析: 枚举起点

AK_HuangYC的博客 653

UVa 11882 最大的数(Biggest Number

题目链接:https://vjudge.net/problem/UVA-11882 大意是:索一下,连起来成为一个数字,不能反复走过一个格子,求最大的数字 思路: 本题索的话,会超时,需要剪枝索剩余可能步数,可以用bfs,基本在O(1)的时间就可以知道剩下几步可以走 #include<bits/stdc++.h> #define LL long long using names...

Inuyasha__的博客 433

UVA-140-Bandwidth-最优性剪枝与回溯

UVA-140-Bandwidth参考题解,参考算法为回溯与剪枝,本文简要介绍在回溯中如何进行最优性剪枝

我是懒狗━┳━ ━┳━ 541

代码小技巧:剪枝(暴力出奇迹)

剪枝是在模型训练过程中使用的一种策略,其主要目的是降低模型的过拟合和提高模型的泛化能力,也可以用来优化模型的复杂度和算法的效率。剪枝是一种常用的优化技术,适用于各种机器学习算法中。本文将从剪枝的概念、类型和实现方式等方面对剪枝进行详细的介绍和解释,并探讨剪枝在机器学习中的应用。

Liuyuanxiao123的博客 1782

DFS之剪枝与优化

dfs优化

m0_63729880的博客 494

算法初探系列3 -度优先索之剪枝策略

dfs的优化,想看的都快快点进来叭~

风斯在下 3491

索(4)dfs的剪枝与优化

简单剪枝

weixin_64197656的博客 1080

新手必懂:DFS 剪枝的 “可行性剪枝” 与 “最优性剪枝” 区别

可行性剪枝:用于确保路径符合约束,提高在约束满足问题中的效率。最优性剪枝:用于优化目标值,提高在求最优解问题中的效率。实际应用中,两者常结合使用:先通过可行性剪枝过滤无效路径,再用最优性剪枝优化结果。掌握这两种剪枝,能显著提升DFS算法的性能。建议从简单问题(如子集和)开始练习,逐步应用到更复杂场景。

2501_94068619的博客 1469

-剪枝优化

通过前面的学习,相信同学们已经掌握了索的基本思路。但有些问题直接索会得到部分分,并不会得到满分,而且分析其时间复杂度也很高。这时候就需要优化,提高索效率。在之前的递归章节,已经介绍了一种优化方式——记忆化。本节重点学习剪枝的优化方式。

Mark1277的博客 1404

最优性剪枝

最优性剪枝

2301_81731156的博客 470

C/C++ Biggest Number

题目描述 You have a maze with obstacles and non-zero digits in it: You can start from any square, walk in the maze, and finally stop at some square. Each step, you may only walk into one of the four n...

情不知所起,一往情深 538

UVa11882最大的数(dfs+剪枝

今天说一道题吧! 题意: 看洛谷https://www.luogu.org/problemnew/show/UVA11882 思路: 根据这道题R,C不是特别大我们可以考虑使用索的方法去做,那么根据R*C=30我们知道普通的dfs会超时, 所以必须考虑剪枝。 怎么剪枝?如果我们只看数字的大小是不科学的(例如99与10000),只看位数也不行, 所以比较的时候我们既需要看位数同时需要...

weixin_30485799的博客 198

UVa140 Bandwidth 【最优性剪枝

题目链接:https://vjudge.net/contest/210334#problem/F 转载于:https://www.cnblogs.com/luruiyuan/p/5847706.html 题目大意:给出一个n个节点的图,求该图中相邻的节点在哪一个由这些节点组成的排列中,带宽最小,输出该排列和最小带宽。(各个节点到相邻节点的最远距离,这些最远距离的最大值即为带宽。) ...

weixin_30920597的博客 153
上一篇: N - Network UVALive - 3902 【链式前向星应用】
下一篇: 区间DP入门学习
努力过
博客等级 码龄9年 93粉丝 295原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值