处理得很巧妙的DFS+BFS……
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define FRE freopen("a.txt","r",stdin);
struct node
{
int x,y;
}queue[1000];
int n,m;
int Max,flag,tatal;
char map[20][20];
char ans[35],stack[35];
int dir[4][2]={-1,0,0,-1,0,1,1,0};
bool yes(int x,int y)
{
return x>=0&&x<n&&y>=0&&y<m;
}
int bfs(int x,int y)
{
node t;
char g[20][20];
for(int i=0;i<n;i++)strcpy(g[i],map[i]);
int head,tail;
head=tail=0;
t.x=x,t.y=y;
queue[tail++]=t;
while(head<tail)
{
x=queue[head].x;
y=queue[head++].y;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(!yes(xx,yy)||g[xx][yy]=='#')continue;
g[xx][yy]='#';
t.x=xx,t.y=yy;
queue[tail++]=t;
}
}
return head;
}
void dfs(int x,int y,int cnt)
{
if(Max<cnt||(Max==cnt&&flag==1))
{
stack[cnt]=0;
strcpy(ans,stack);
Max=cnt;
flag=0;
}
int res=bfs(x,y);
if(res+cnt-1<Max||(res+cnt-1==Max&&flag==-1))return;
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(!yes(xx,yy)||map[xx][yy]=='#')continue;
if(flag!=1&&ans[cnt]>map[xx][yy]&&tatal==Max)continue;
stack[cnt]=map[xx][yy];
map[xx][yy]='#';
if(flag==0)
{
if(cnt>=Max)flag=1;
else if(ans[cnt]==stack[cnt])flag=0;
else if(ans[cnt]<stack[cnt])flag=1;
else flag=-1;
dfs(xx,yy,cnt+1);
flag=0;
}
else dfs(xx,yy,cnt+1);
map[xx][yy]=stack[cnt];
}
}
int main()
{
//FRE;
while(scanf("%d%d",&n,&m)&&n+m)
{
tatal=0;
for(int i=0;i<n;i++)
{
scanf("%s",map+i);
for(int j=0;j<m;j++)
{
if(map[i][j]!='#')tatal++;
}
}
Max=1;
memset(ans,0,sizeof(ans));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(map[i][j]=='#')continue;
if(Max==tatal&&ans[0]>map[i][j])continue;
stack[0]=map[i][j];
map[i][j]='#';
if(ans[0]==stack[0])flag=0;
else if(ans[0]<stack[0])flag=1;
else flag=-1;
dfs(i,j,1);
map[i][j]=stack[0];
}
}
printf("%s\n",ans);
}
return 0;
}