原题链接: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] = '