UVA11882 Biggest Number
来源:互联网 发布:lol数据异常请规范游戏 编辑:程序博客网 时间:2024/06/05 01:14
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23314
题意:给定一个方格,格子里或者是数字或者是'#'(即不能通过),问按照贪食蛇走法,按先后来排序,得到最大数字是什么(明显没有说清楚好嘛!)
思路:搜索。刚开始想到的只有DFS,超时。上网查题解才知道要用预判进行强力的剪枝。首先用长度进行预判,再在长度相等时按位进行预判。代码中设立了几个神奇的变量flag和cnt,应用起来简直超神。好题一个!
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;
int r,c,total,len,flag;///total for digit's number
int const MAXN = 15+5;
int vis[MAXN][MAXN];///re for recent number
char s[MAXN][MAXN],ans[30+5],re[30+5];
int dx[] = {-1,0,1,0}; int dy[] = {0,1,0,-1};
void init()
{
ans[0] = '0';
ans[1] = '\0';
total = len = 0;
memset(vis,0,sizeof(vis));
for(int i=0; i<r; i++){
scanf("%s",s[i]);
for(int j=0; j<c; j++)
if(s[i][j]!='#')
total++;
}
}
bool cmp(int a,int b)
{
return a>b;
}
bool valid(int x,int y)
{
if(x<0 || x>=r || y<0 || y>=c)
return false;
return true;
}
int bfs(int x,int y)
{
int res = 0,i,j;
int m,n;
int tvis[MAXN][MAXN];
memcpy(tvis,vis,sizeof(vis));
// step[res++] = s[x][y];
res++;
int t = x*c+y;
queue <int> q;
q.push(t);
while(!q.empty()){
t = q.front(); q.pop();
for(i=0; i<4; i++){
int tx = dx[i] + t/c; int ty = dy[i] + t%c;
if(valid(tx,ty) && tvis[tx][ty] == 0 && s[tx][ty] != '#')
{
tvis[tx][ty] = 1;
res++;
// step[res++] = s[tx][ty];
q.push(tx*c+ty);
}
}
}
return res;
}
void dfs(int x, int y, int cnt)
{
if(len<cnt || (flag==1 && cnt==len)){
re[cnt] = '\0';
len = cnt;
strcpy(ans,re);
flag = 0;
}
int i,j;
int maxlen = bfs(x,y);
if(maxlen+cnt-1 < len || (maxlen+cnt-1==len && flag==-1))
return;
for(i=0; i<4; i++){
int tx = dx[i]+x; int ty = dy[i] + y;
char t = s[tx][ty];
if(!valid(tx,ty) || vis[tx][ty] || s[tx][ty] == '#')
continue;
if(flag==0 && ans[cnt]>s[tx][ty] && total == len) continue;
vis[tx][ty] = 1;
re[cnt] = s[tx][ty];
if(flag == 0){
if(t>ans[cnt]) flag = 1;
else if(t<ans[cnt]) flag = -1;
dfs(tx,ty,cnt+1);
flag = 0;
}
else dfs(tx,ty,cnt+1);
vis[tx][ty] = 0;
}
}
void solve()
{
len = total = 0;
int i,j;
for(i=0; i<r; i++){
for(j=0; j<c; j++){
if(s[i][j]!='#'){
if(len == total && ans[0]>s[i][j]) continue;
if(ans[0]>s[i][j]) flag = -1;
else if(ans[0]<s[i][j]) flag = 1;
else flag = 0;
vis[i][j] = 1;
re[0] = s[i][j];
dfs(i,j,1);
vis[i][j] = 0;
}
}
}
printf("%s\n",ans);
}
int main()
{
while(scanf("%d%d",&r,&c)!=EOF ){
if(r+c==0)
break;
init();
solve();
}
return 0;
}
- UVA11882 Biggest Number
- UVA11882 Biggest Number 强剪枝
- Uva11882 Biggest Number 【dfs回溯+bfs剪枝】【习题7-15】
- Biggest Number
- 11882 - Biggest Number
- Hoj 13326 Biggest Number
- uva 11882Biggest Number
- UVA 11882Biggest Number
- toj 4610 Biggest Number
- uva Biggest Number UVA
- Biggest Number UVA
- Biggest Number UVA
- Uva 11882 Biggest Number (IDA*)
- UVA 11882(p218)----Biggest Number
- NBUT [1464] Biggest Number dfs
- 619. Biggest Single Number--MAX()
- 【搜索+强剪枝】UVA-11882 - Biggest Number
- Find Nth Biggest Number Based On QuickSort
- Vijava 学习笔记之HostSystem(内存利用率)
- CASE WHEN 两种用法
- Android初学习 - Handler使用的简单例子
- 开启arc之后 NSNotificationCenter removeObserver 是否需要调用?
- x86、armeabi、armeabi-v7a Application.mk NDK 相关
- UVA11882 Biggest Number
- 2015/4/15 华为实习面试
- 第六周项目六复数模板类(3)
- ViewController详解
- FaceBook推出的Android图片加载库Fresco
- oracle中常用的查询方法
- win 下杀端口
- 匹配
- C语言要这样学才能学好