HDU 2821 Pusher

  原题链接: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  
View Code

 

  

你可能感兴趣的:(push)