http://acm.hdu.edu.cn/showproblem.php?pid=2821
基本是照着别人代码写的~~
http://blog.csdn.net/power721/article/details/6860792
#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 0x3f3f3f3f
#define BUG printf("here!\n")
using namespace std;
char map[30][30];
int num[30][30];
int xx[4]={0,1,0,-1};
int yy[4]={1,0,-1,0};
char pos[4]={'R','D','L','U'};
char res[800];
int ans;
int cnt,flag;
int r,c;
int ok(int x,int y)
{
if(x<0||x>=r||y<0||y>=c)
return 0;
if(num[x][y]==0)
return 1;
else
return -1;
}
int DFS(int x,int y,int k)
{
int i;
int nx,ny;
int tx,ty;
for(i=0;i<4;i++)
{
nx=x+xx[i];
ny=y+yy[i];
if(ok(nx,ny)!=1)
continue;
do
{
nx+=xx[i];
ny+=yy[i];
}while(ok(nx,ny)==1);
if(ok(nx,ny)&&ok(tx=nx+xx[i],ty=ny+yy[i]))
{
int t=num[nx][ny];
res[k]=pos[i];
if(t==1||num[tx][ty])
cnt--;
if(cnt==0)
{
ans=k;
return 1;
}
num[nx][ny]=0;
num[tx][ty]+=t-1;
if(DFS(nx,ny,k+1))
return 1;
num[nx][ny]=t;
num[tx][ty]-=t-1;
if(t==1||num[tx][ty])
cnt++;
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&c,&r)!=EOF)
{
int i,j;
flag=1;
int count=0;
for(i=0;i<r;i++)
{
scanf("%s",map[i]);
for(j=0;j<c;j++)
{
if(map[i][j]>='a'&&map[i][j]<='z')
{
num[i][j]=map[i][j]-'a'+1;
count++;
}
else
num[i][j]=0;
}
}
//printf("%d\n",count);
int ff[30][30];
memset(ff,0,sizeof(ff));
int x,y;
for(i=0;i<r&&flag;i++)
for(j=0;j<c&&flag;j++)
if(num[i][j])
{
int l;
for(l=0;l<4&&flag;l++)
{
x=i+xx[l]*2;
y=j+yy[l]*2;
if(ok(x,y)==1&&!ff[x][y])
{
ff[x][y]=1;
cnt=count;
if(DFS(x,y,0))
flag=0;
}
}
}
printf("%d\n%d\n",x,y);
for(i=0;i<=ans;i++)
printf("%c",res[i]);
printf("\n");
}
return 0;
}