题目大意:给出一个方格矩阵,矩阵中有数字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+强剪枝)的更多相关文章

  1. 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 ...

  2. 湖南省第六届省赛题 Biggest Number (dfs+bfs,好题)

    Biggest Number 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 You have a maze with obstacles and non-zero di ...

  3. 【UVa】11882 Biggest Number(dfs+剪枝)

    题目 题目     分析 典型搜索,考虑剪枝. 统计一下联通分量. 1.本位置能够达到所有的点的数量加上本已有的点,还没有之前的结果长,直接返回. 2.当本位置能够达到所有的点的数量加上本已有的点与之 ...

  4. POJ2308连连看dfs+bfs+优化

    DFS+BFS+MAP+剪枝 题意:       就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路:      首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...

  5. poj 3134 Power Calculus(迭代加深dfs+强剪枝)

    Description Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multipli ...

  6. UVA11882-Biggest Number(DFS+最优化剪枝)

    Problem UVA11882-Biggest Number Accept: 177    Submit: 3117Time Limit: 1000 mSec    Memory Limit : 1 ...

  7. 湖南省第六届大学生程序设计大赛原题 F Biggest Number (UVA1182)

    Biggest Number http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30851#problem/F 解题思路:DFS(检索)+BF ...

  8. 湖南省第6届程序大赛第6题 Biggest Number

    Problem F Biggest Number You have a maze with obstacles and non-zero digits in it: You can start fro ...

  9. 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)

    [题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...

随机推荐

  1. UESTC_酱神赏花 2015 UESTC Training for Dynamic Programming<Problem C>

    C - 酱神赏花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  2. Summary Ranges 解答

    Question Given a sorted integer array without duplicates, return the summary of its ranges. For exam ...

  3. Linux 文件

    Linux系统中:.a文件是静态链接库文件.所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了 ...

  4. 第一个MyBatis程序

    最近研究了一些MyBatis技术,虽然工作中还未用到,但是觉得了解一下也是不错的.这里记录了第一个简单的Demo程序,防止自己忘记. 第一步需要配置Mybatis-config.xml文件.注意:这里 ...

  5. 用 oracle vitual box 克隆虚拟机,找不到eth0的解决方案

    用 oracle vitual box 克隆虚拟机 当我们需要使用多台虚拟机的时候,如果一台一台的安装,实在是太过麻烦了.所以一般的虚拟机软件都为我们提供了克隆已有虚拟机状态的功能.Oracle vi ...

  6. Exploring TCP state machine by graphs

    States TCP includes 11 states, they are: LISTEN SYN_SENT SYN_RECV ESTABLISHED FIN_WAIT1 CLOSE_WAIT F ...

  7. SSH框架-unexpected token: * near line 1, column 8 [select * from tb_chaper where course_id = 2];报错解决方法

    SSH项目,访问jsp页面出现报错,控制台显示报错信息: org.springframework.orm.hibernate3.HibernateQueryException: unexpected ...

  8. 这个更新需要花去 50.6 M 磁盘上总计 /boot 的空间。请在 7737k 磁盘上留出 /boot 空间。清空您的回收站和临时文件,用“sudo apt-get clean

    系统升级会下载多余的内核,删除即可. 1.命令:dpkg --get-selections|grep linux             //带image的为系统内核 2.命令:   uname -a ...

  9. 关于vnc连接闪退问题的设置

    设置如下: 依次点Option-->Advanced-->Expert找到ColourLevel,默认值是pal8,修改为rgb222或full.

  10. 不同SQL Server数据库之间的跨数据库查询

    --不同SQL Server数据库之间的跨数据库查询 EXEC sp_addlinkedserver @server=N'OldDatabase', --自己定义别名 @srvproduct=N'', ...