UVA - 11882 Biggest Number(dfs+bfs+强剪枝)
题目大意:给出一个方格矩阵,矩阵中有数字0~9,任选一个格子为起点,将走过的数字连起来构成一个数,找出最大的那个数,每个格子只能走一次。
题目分析:DFS。剪枝方案:在当前的处境下,找出所有还能到达的点的个数,若当前数字的长度加上个数仍小于目前最优答案的长度,则剪去;若长度相等,则将所有还能到达的数字按从大到小排序后连到当前数字上,如果还比目前最优解小,则减去。找出所有还能到达的点的过程用BFS实现。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<bitset>
#include<map>
#include<vector>
#include<stdlib.h>
#include <stack>
using namespace std;
#define PI acos(-1.0)
#define max(a,b) (a) > (b) ? (a) : (b)
#define min(a,b) (a) < (b) ? (a) : (b)
#define ll long long
#define eps 1e-10
#define MOD 1000000007
#define N 16
#define M 36
#define inf 1e12
int n,m;
char mp[N][N];
int vis[N][N];
int flag[N][N];
int can[N<<];
int dirx[]={,,-,};
int diry[]={-,,,};
string ans; bool smaller(string a,string b){
if(a.size()<b.size()) {
return true;
}
if(a.size()==b.size()){
if(a<b){
return true;
}
}
return false;
} bool ok(int x,int y){
if(x< || x>=n || y< || y>=m || mp[x][y]=='#') return false;
return true;
}
int bfs(int x,int y){
queue<int> q;
q.push(x*M+y);
memset(flag,,sizeof(flag));
flag[x][y]=;
int step=;
while(!q.empty()){
int t=q.front();
q.pop(); for(int i=;i<;i++){
int tx=t/M; int ty=t%M;
tx+=dirx[i]; ty+=diry[i];
if(vis[tx][ty] || flag[tx][ty] || !ok(tx,ty)) continue;
can[step++]=mp[tx][ty]-'';
flag[tx][ty]=;
q.push(tx*M+ty);
}
}
return step;
} void dfs(int x,int y,string tmp){
if(smaller(ans,tmp)){
ans=tmp;
}
int get_step=bfs(x,y);
if(get_step+tmp.size()<ans.size()){
return;
}
if(get_step+tmp.size()==ans.size()){
sort(can,can+get_step);
string now=tmp;
for(int i=get_step-;i>=;i--){
now+=char(can[i]+'');
}
if(smaller(now,ans)){
return;
}
}
for(int i=;i<;i++){
int tx=x+dirx[i];
int ty=y+diry[i];
if(vis[tx][ty] || !ok(tx,ty)) continue; vis[tx][ty]=;
dfs(tx,ty,tmp+mp[tx][ty]);
vis[tx][ty]=;
}
}
int main()
{
while(scanf("%d%d",&n,&m)==){
if(n== && m==){
break;
}
for(int i=;i<n;i++){
scanf("%s",mp[i]);
}
ans.clear();
memset(vis,,sizeof(vis));
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(mp[i][j]!='#'){
vis[i][j]=;
string tmp; tmp.clear();
tmp+=mp[i][j];
dfs(i,j,tmp);
vis[i][j]=;
}
}
}
cout<<ans<<endl; }
return ;
}
UVA - 11882 Biggest Number(dfs+bfs+强剪枝)的更多相关文章
- UVA 11882 Biggest Number(搜索+剪枝)
You have a maze with obstacles and non-zero digits in it: You can start from any square, walk in the ...
- 湖南省第六届省赛题 Biggest Number (dfs+bfs,好题)
Biggest Number 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 You have a maze with obstacles and non-zero di ...
- 【UVa】11882 Biggest Number(dfs+剪枝)
题目 题目 分析 典型搜索,考虑剪枝. 统计一下联通分量. 1.本位置能够达到所有的点的数量加上本已有的点,还没有之前的结果长,直接返回. 2.当本位置能够达到所有的点的数量加上本已有的点与之 ...
- POJ2308连连看dfs+bfs+优化
DFS+BFS+MAP+剪枝 题意: 就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路: 首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...
- poj 3134 Power Calculus(迭代加深dfs+强剪枝)
Description Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multipli ...
- UVA11882-Biggest Number(DFS+最优化剪枝)
Problem UVA11882-Biggest Number Accept: 177 Submit: 3117Time Limit: 1000 mSec Memory Limit : 1 ...
- 湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)
Biggest Number http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30851#problem/F 解题思路:DFS(检索)+BF ...
- 湖南省第6届程序大赛第6题 Biggest Number
Problem F Biggest Number You have a maze with obstacles and non-zero digits in it: You can start fro ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
随机推荐
- UESTC_秋实大哥与家 2015 UESTC Training for Data Structures<Problem E>
E - 秋实大哥与家 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- Implement Queue using Stacks 解答
Question Implement the following operations of a queue using stacks. push(x) -- Push element x to th ...
- Linux环境Nginx安装多版本PHP
php5.4.44 所谓多版本多版本PHP就是php5.4和5.5以及其他版本在同一台服务器. 假如php5.5是主版本已经安装在/usr/local/php目录下,那么再安装其他版本的php再指定不 ...
- django 启动和请求
Django运行方式 调试模式 直接 python manage.py runserver python manage.py runserver python manage.py runserver ...
- magento添加系统sections配置时应注意的事项
(1)只有在新增sections是需要增加对应的acl配置,这个配置可以放在config.xml中或者放在adminhtml.xml中 <adminhtml> <acl> &l ...
- LinearGradient线性渲染
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impor ...
- vue+webpack项目实战
概述 -- 项目中会用到的插件 vue-router vue-resource 打包工具 webpack 依赖环境 node.js start 安装vue开发的模板 # 全局安装 vue-cli $ ...
- H5单页面架构:backbone + requirejs + zepto + underscore
首先,来看看整个项目结构. 跟上一篇angular类似,libs里多了underscore和zepto.三个根目录文件: index.html:唯一的html main.js:requirejs的配置 ...
- android stagefright基本流程总结
数据流的封装一. 由数据源DataSource生成MediaExtractor. 通过MediaExtractor::Create(dataSource)来实现.Create方法通过两步来生成相应的M ...
- 从客户端(Content="<p>666</p>")中检测到有潜在危险的 Request.Form 值。
出现:从客户端(Content="<p>测试</p>")中检测到有潜在危险的 Request.Form 值. 一般是在线编辑器有HTML标签的,我是用的MV ...