代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
struct node{
int x,y;
};
struct node mov[4]={{-1,0},{0,1},{1,0},{0,-1}};
struct spot{
int num;
int x,y;
}sp[35];
bool cmp(spot x,spot y){
return x.num>y.num;
}
int n,m;
int vis[35][35];
int map[35][35];
int nx,ny;
int ans[100];//最长路径
int ansl;//最长路径长度
int now[100];//当前查找路径
int nowl;//当前查找路径长度
bool check(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m){
return 1;
}
return 0;
}
void dfs(int x,int y)
{
bool walk=0;
for(int i=0;i<=3;i++)
{
int nx=x+mov[i].x;
int ny=y+mov[i].y;
if(vis[nx][ny]==0&&check(nx,ny))
{
walk=1;
vis[nx][ny]=1;
now[nowl]=map[nx][ny];
nowl++;
// for(int j=0;j<nowl;j++)
// {
// printf("%d",now[j]);
// }
// printf("\n");
dfs(nx,ny);
nowl--;
// for(int j=0;j<nowl;j++)
// {
// printf("%d",now[j]);
// }
// printf("\n");
vis[nx][ny]=0;
}
}
if(walk==0)
{
if(nowl>ansl)
{
for(int j=0;j<nowl;j++)
{
ans[j]=now[j];
}
ansl=nowl;
}
else if(nowl==ansl)
{
bool flag=0;
for(int j=0;j<nowl;j++)
{
if(now[j]>ans[j])
{
flag=1;
break;
}
else if(now[j]<ans[j])
break;
}
if(flag)
{
for(int j=0;j<nowl;j++)
{
ans[j]=now[j];
}
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
{
memset(vis,0,sizeof(vis));
memset(now,0,sizeof(now));
memset(ans,0,sizeof(ans));
memset(map,0,sizeof(map));
memset(sp,0,sizeof(sp));
ansl=0;
char c;
int tot=0;
getchar();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%1c",&c);
if(c=='#')
{
map[i][j]=0;
vis[i][j]=1;
}
else
{
map[i][j]=c-'0';
sp[tot].num=map[i][j];
sp[tot].x=i;
sp[tot].y=j;
tot++;
}
}
getchar();
}
sort(sp,sp+tot-1,cmp);
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// printf("%d",vis[i][j]);
// }
// printf("\n");
// }
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// printf("%d",map[i][j]);
// }
// printf("\n");
// }
// bool f=1;
// for(int u=9;u>=1&&f;u--)
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// if(map[i][j]==u){
// //printf("%d,%d\n",i,j);
// nowl=1;
// now[0]=map[i][j];
// vis[i][j]=1;
// dfs(i,j);
// vis[i][j]=0;
// }
// if(ansl==tot){
// f=0;
// }
// }
// }
for(int i=0;i<tot;i++){
int x=sp[i].x;
int y=sp[i].y;
nowl=1;
now[0]=map[x][y];
vis[x][y]=1;
dfs(x,y);
vis[x][y]=0;
if(ansl==tot&&ans[0]>sp[i].num){
break;
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// if(map[i][j]!=0){
// //printf("%d,%d\n",i,j);
// nowl=1;
// now[0]=map[i][j];
// vis[i][j]=1;
// dfs(i,j);
// vis[i][j]=0;
// }
// }
// }
if(ansl==0)
{
printf("0");
}
for(int i=0;i<ansl;i++)
{
printf("%d",ans[i]);
}
printf("\n");
}
return 0;
}