题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821
思路:一开始的时候没注意到,必须从map[i][j]==0的位置开始,然后就是dfs了,回溯的时候稍微注意一下就可以了。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<string> 6 using namespace std; 7 8 int n,m,cnt; 9 char str[33]; 10 int map[33][33]; 11 int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 12 char Dir[7]={'U','D','L','R'}; 13 char path[1111]; 14 15 bool Judge(int x,int y) 16 { 17 if(x>=0&&x<n&&y>=0&&y<m) 18 return true; 19 return false; 20 } 21 22 bool dfs(int x,int y,int len) 23 { 24 if(len>=cnt){ 25 path[len]=0; 26 return true; 27 } 28 for(int i=0;i<4;i++){ 29 int xx=x+dir[i][0]; 30 int yy=y+dir[i][1]; 31 if(!Judge(xx,yy)||map[xx][yy])continue; 32 while(Judge(xx,yy)&&!map[xx][yy]){ 33 xx+=dir[i][0]; 34 yy+=dir[i][1]; 35 } 36 if(!Judge(xx+dir[i][0],yy+dir[i][1]))continue; 37 int tmp=map[xx][yy]; 38 map[xx+dir[i][0]][yy+dir[i][1]]+=tmp-1; 39 map[xx][yy]=0; 40 path[len]=Dir[i]; 41 if(dfs(xx,yy,len+1))return true; 42 map[xx+dir[i][0]][yy+dir[i][1]]-=tmp-1; 43 map[xx][yy]=tmp; 44 } 45 return false; 46 } 47 48 49 50 int main() 51 { 52 while(~scanf("%d%d",&m,&n)){ 53 cnt=0; 54 for(int i=0;i<n;i++){ 55 scanf("%s",str); 56 for(int j=0;j<m;j++){ 57 if(str[j]!='.'){ 58 cnt+=str[j]-'a'+1; 59 map[i][j]=str[j]-'a'+1; 60 }else 61 map[i][j]=0; 62 } 63 } 64 bool flag=false; 65 for(int i=0;i<n;i++){ 66 for(int j=0;j<m;j++){ 67 if(map[i][j]==0&&dfs(i,j,0)){ //必须从map[i][j]==0的位置开始 68 flag=true; 69 printf("%d\n%d\n",i,j); 70 cout<<path<<endl; 71 break; 72 } 73 } 74 if(flag)break; 75 } 76 } 77 return 0; 78 }