您的位置:首页 > 其它

UVA 11882(p218)----Biggest Number

2016-02-27 13:49 435 查看
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdio>
using namespace std;
typedef long long LL;
const int maxn=33;
struct node
{
int a[maxn],len;
void cl()
{
len=0;
}
void print()
{
for(int i=0;i<len;i++) printf("%d",a[i]);
printf("\n");
}
bool operator < (const node &rhs) const
{
if(len!=rhs.len) return len<rhs.len;
for(int i=0;i<len;i++)
if(a[i]!=rhs.a[i]) return a[i]<rhs.a[i];
return false;
}
};
struct point
{
int x,y;
};
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
node ans,now,tmp;
char mat[maxn][maxn];
bool vis[maxn][maxn];
bool vis2[maxn][maxn];
int n,m;
int can[maxn];
int maxlen(int x,int y)
{
queue<point> q;
point temp;
temp.x=x;temp.y=y;
q.push(temp);
int ret=1;
can[0]=mat[x][y]-'0';
memset(vis2,0,sizeof(vis2));
vis2[x][y]=1;
while(!q.empty())
{
point now,next;
now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x=now.x+dx[i];
next.y=now.y+dy[i];
if(!isdigit(mat[next.x][next.y])||vis[next.x][next.y]||vis2[next.x][next.y]) continue;
vis2[next.x][next.y]=true;
can[ret++]=mat[next.x][next.y]-'0';
q.push(next);
}
}
return ret;
}
void dfs(int x,int y)
{
now.a[now.len++]=mat[x][y]-'0';
vis[x][y]=true;
for(int i=0;i<4;i++)
{
int px=x+dx[i],py=y+dy[i];
if(!isdigit(mat[px][py])||vis[px][py]) continue;
int wantlen=maxlen(px,py);
if(now.len+wantlen<ans.len) continue;
if(now.len+wantlen==ans.len)
{
sort(can,can+wantlen);
tmp=now;
for(int i=wantlen-1;i>=0;i--)
tmp.a[tmp.len++]=can[i];
if(tmp<ans) continue;
}
dfs(px,py);
}
if(ans<now) ans=now;
now.len--;
vis[x][y]=false;
}
int main()
{
//freopen("in.in","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
memset(mat,0,sizeof(mat));
for(int i=1;i<=n;i++)
scanf("%s",&mat[i][1]);
ans.cl();now.cl();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(isdigit(mat[i][j])) dfs(i,j);
}
ans.print();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: