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; }