原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821
首先,题目描述给的链接游戏很好玩,建议先玩几关,后面越玩越难,我索性把这道题A了,也就相当于通关了。
其实这道题算是比较水点搜索题,直接DFS + 回溯,但是题目描述不是很清楚使得很难下手,后来枚举题意才知道在边缘位置不会出现嵌套盒子,而且所有输入都肯定有解决的方案,所有的输入数据都是标准的。
1 #include <stdio.h> 2 #include <string.h> 3 #include <string> 4 #include <stdlib.h> 5 #include <math.h> 6 #include <vector> 7 #include <map> 8 #include <queue> 9 #include <algorithm> 10 #include <iostream> 11 #include <stack> 12 using namespace std; 13 const int maxn = 30; 14 15 int dr[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; 16 char dd[4] = {'R', 'L', 'D', 'U'}; 17 char g[maxn][maxn]; 18 char path[25 * 25 * 10]; 19 int a[maxn][maxn]; 20 int r, c; 21 bool ok(int x, int y) 22 { 23 if(x >= 0 && x < c && y >= 0 && y < r && a[y][x] == 0) 24 return true; 25 return false; 26 } 27 28 int dfs(int cy, int cx, int cnt, int len) 29 { 30 if(len == cnt) 31 return 1; 32 for(int k = 0; k < 4; k++) 33 { 34 int x = cx + dr[k][0]; 35 int y = cy + dr[k][1]; 36 if(ok(x, y)) 37 { 38 do 39 { 40 x += dr[k][0]; 41 y += dr[k][1]; 42 } 43 while(ok(x, y)); 44 if(x >= 0 && x < c && y >= 0 && y < r) 45 { 46 int tmp = a[y][x]; 47 a[y + dr[k][1]][x + dr[k][0]] += a[y][x] - 1; 48 a[y][x] = 0; 49 path[len] = dd[k]; 50 if(dfs(y, x, cnt, len+1)) 51 return 1; 52 path[len] = '\0'; 53 a[y][x] = tmp; 54 a[y + dr[k][1]][x + dr[k][0]] -= a[y][x] - 1; 55 } 56 } 57 58 } 59 return 0; 60 } 61 62 int main() 63 { 64 int cnt; 65 while(scanf("%d %d", &c, &r) != EOF) 66 { 67 cnt = 0; 68 for(int i = 0; i < r; i++) 69 { 70 scanf("%s", g[i]); 71 for (int j = 0; j < c; j++) 72 { 73 if(g[i][j] != '.') 74 cnt += g[i][j] - 'a' + 1, a[i][j] = g[i][j] - 'a' + 1; 75 else 76 a[i][j] = 0; 77 } 78 } 79 int i, j; 80 bool flag = false; 81 for(i = 0; i < r; i++) 82 { 83 for(j = 0; j < c; j++) 84 { 85 if(a[i][j] == 0 && dfs(i, j, cnt, 0)) 86 { 87 flag = true; 88 break; 89 } 90 } 91 if(flag) break; 92 } 93 printf("%d\n%d\n", i, j); 94 for(int i = 0; i < cnt; i++) putchar(path[i]); 95 putchar('\n'); 96 } 97 return 0; 98 } 99