当前位置:   article > 正文

【贪吃蛇问题】_可能有不少的同学玩过“贪吃蛇“的游戏,游戏中蛇头带动整个蛇的移动,蛇身将沿蛇头

可能有不少的同学玩过“贪吃蛇“的游戏,游戏中蛇头带动整个蛇的移动,蛇身将沿蛇头

问题:

可能有不少的同学玩过“贪吃蛇“的游戏,游戏中蛇头带动整个蛇的移动,蛇
身将沿蛇头移动过的位置进行移动。如果将整条蛇分成若干个方格,则可以表示为
S1,S2,S3,…,SL,其中 S1 为蛇头,SL 为蛇尾,中间则是蛇头到蛇尾之间的部分。蛇在某
个区域内移动时,如果蛇头所在位置的上下左右四个方向没有其它的物体,则蛇头 S1 可以
朝其中任何一个方格移动,蛇身则填补前面移动后的区域,也就是 S2 移动到 S1 所在区域,
S3 移动到 S2 所在区域……,依次类推,如下图所示。
c573a998670f48ddb9de267ec9ea3785.png
备注:左图为蛇移动前的情况。右图为蛇向下移动一个方格后的情况。蓝色填充的方格
表示有障碍物。
请判断蛇是否可以从它当前所在的位置移动到出口所在的位置,如果能,则给出最少需
要移动的步数。如果不能,则输出“Impossible”。
输入要求:
输入的第 1 行包含三个整数 n, m(l<=n, m<=20) 和 L (2<=L<=8),分别表示蛇所在区域的大小(行,列方格数)以及蛇的长度。其后的 L 行用于表示从蛇头到蛇尾依次占用的
方格的行列值。紧接着的 1 行包含一个整数 K,表示该区域内障碍物占用的方格数。之后的
K 行,每行包含两个整数,分别表示障碍物所占用的方格的行列值。出口所在的位置为(1,
1),且出口处没有障碍物。
输出要求:
输出 1 行,如果蛇能够到达出口,则输出蛇从当前位置移动到出口位置最少需要移动的
方格数量,否则输出“Impossible”。
样例输入:
8 8 6
6 2
5 2
5 3
4 3
4 2
3 2
5
3 1
6 1
4 6
5 6
6 4
样例输出:
12

思路:

回溯法

代码(6.7更新,把sign去掉了):

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define exit_x 1
  4. #define exit_y 1
  5. int n, m, l, k;
  6. int dx[] = {-1, 0, 0, 1};
  7. int dy[] = {0, -1, 1, 0};
  8. int best = INT_MAX;
  9. int solve(int **blocks, int h, int t, int *snake_x, int *snake_y, int total)
  10. {
  11. int result = INT_MAX;
  12. if(total >= best) return total;
  13. int head_x = snake_x[h], head_y = snake_y[h];
  14. if(head_x == exit_x && head_y == exit_y)
  15. {
  16. best = total;
  17. return total;
  18. }
  19. for(int i = 0; i < 4; i++)
  20. {
  21. int new_x = head_x + dx[i];
  22. int new_y = head_y + dy[i];
  23. if(new_x < 1 || new_x > n || new_y < 1 || new_y > m) continue;
  24. if(blocks[new_x][new_y]) continue;
  25. bool hurt = false;
  26. for(int j = 0; j < l; j++)
  27. {
  28. if(snake_x[j] == new_x && snake_y[j] == new_y) hurt = true;
  29. }
  30. if(hurt) continue;
  31. int tempx = snake_x[(h-1+l)%l], tempy = snake_y[(h-1+l)%l];
  32. snake_x[(h-1+l)%l] = new_x;
  33. snake_y[(h-1+l)%l] = new_y;
  34. int this_time = solve(blocks, (h-1+l)%l, (t-1+l)%l, snake_x, snake_y, total+1);
  35. if(this_time < result) result = this_time;
  36. snake_x[(h-1+l)%l] = tempx;
  37. snake_y[(h-1+l)%l] = tempy;
  38. }
  39. return result;
  40. }
  41. void Delete(int **blocks, int *snake_x, int *snake_y)
  42. {
  43. for(int i = 1; i <= n; i++)
  44. {
  45. delete [] blocks[i];
  46. }
  47. delete [] snake_x;
  48. delete [] snake_y;
  49. }
  50. int main()
  51. {
  52. cin >> n >> m >> l;
  53. int **blocks = new int*[n+1];
  54. for(int i = 1; i <= n; i++)
  55. {
  56. blocks[i] = new int[m+1]();
  57. }
  58. int *snake_x = new int[l+1]();
  59. int *snake_y = new int[l+1]();
  60. for(int i = 0; i < l; i++)
  61. {
  62. cin >> snake_x[i] >> snake_y[i];
  63. }
  64. cin >> k;
  65. for(int i = 1; i <= k; i++)
  66. {
  67. int x, y;
  68. cin >> x >> y;
  69. blocks[x][y] = 1;
  70. }
  71. int steps = solve(blocks, 0, l-1, snake_x, snake_y, 0);
  72. if(steps == INT_MAX) cout << "Impossible" << endl;
  73. else cout << steps << endl;
  74. Delete(blocks, snake_x, snake_y);
  75. return 0;
  76. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/1001549
推荐阅读
相关标签
  

闽ICP备14008679号