标签:
链接:http://vjudge.net/problem/35587
分析:先预处理出走i次的总步数step_sum,方便以后剪枝。然后初始化map,把map整体移到第一象限,(x+maxd,y+maxd)。对于x或y的坐标值的绝对值大于maxd的障碍点可以直接忽视,因为根本走不到。把障碍物的坐标值加上maxd在map上标记为-1(数组下标值为非负整数)。然后设计DFS状态,包括当前所在的坐标,一次可以走的步数和先前走的方向。当前位置(x,y)可以向四个方向移动step步,但是和先前方向相同或相反要剪枝,再判断下途中是否会遇到障碍点和乐观预测当前坐标是否还能回到出发点,再剪枝。将经过的路径在map中标记为1,避免重复走到同一位置,记录当前选择的移动的方向,记得选择方向时要按字典序从小到大选择,继续递归,复位map。当递归边界为step>n时,判断是否回到出发点,若是则打印出移动序列,移动序列总数自增,若否则直接return,最后dfs结束后,打印出移动序列总数。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 5 const int dir[4][2] = { 6 {1, 0}, // ? 0 7 {0, 1}, // ? 1 8 {0, -1}, // ? 2 9 {-1, 0}, // ? 3 10 }; 11 const int maxd = 110; 12 const int maxs = 220; 13 const int maxp = 20; 14 15 int n, num, map[maxs][maxs], step_sum[maxp + 1]; 16 char path[maxp]; 17 char pos[5] = "ensw"; 18 19 void init() { 20 num = 0; 21 int a, b, k; 22 memset(map, 0, sizeof(map)); 23 scanf("%d%d", &n, &k); 24 for (int i = 0; i < k; i++) { 25 scanf("%d%d", &a, &b); 26 if (abs(a) > maxd || abs(b) > maxd) continue; 27 map[a + maxd][b + maxd] = -1; 28 } 29 } 30 31 bool judge(int x, int y, int step, int c) { 32 for (int i = 1; i <= step; i++) { 33 x += dir[c][0]; y += dir[c][1]; 34 if (map[x + maxd][y + maxd] == -1) return true; 35 } 36 if (abs(x) + abs(y) > step_sum[20] - step_sum[step]) return true; 37 return false; 38 } 39 40 void dfs(int x, int y, int step, int pre_dir) { 41 if (step > n) { 42 if (!x && !y) { 43 num++; 44 for (int i = 0; i < n; i++) printf("%c", path[i]); 45 printf("\n"); 46 } 47 return; 48 } 49 for (int i = 0; i < 4; i++) { 50 if (i == pre_dir || i + pre_dir == 3) continue; 51 if (judge(x, y, step, i)) continue; 52 int nx = x + dir[i][0] * step, ny = y + dir[i][1] * step; 53 if (map[nx + maxd][ny + maxd]) continue; 54 map[nx + maxd][ny + maxd] = 1; 55 path[step - 1] = pos[i]; 56 dfs(nx, ny, step + 1, i); 57 map[nx + maxd][ny + maxd] = 0; 58 } 59 } 60 61 int main() { 62 int T; 63 step_sum[0] = 0; 64 for (int i = 1; i <= maxp; i++) step_sum[i] = step_sum[i - 1] + i; 65 scanf("%d", &T); 66 while (T--) { 67 init(); 68 dfs(0, 0, 1, -1); 69 printf("Found %d golygon(s).\n\n", num); 70 } 71 return 0; 72 }
标签:
原文地址:http://www.cnblogs.com/XieWeida/p/5860223.html