• UVA-816 Abbott的复仇 题解答案代码 算法竞赛入门经典第二版


    GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版

    题目本身就是在普通的最短路题目中增加了方向的指定,比普通的最短路稍微麻烦一点而已。

    但是题目难做的点在于这个数据有点奇怪。

    1. 起始点的方向可以不按照允许的方向执行。

    2. 起点和终点即使是同一个点也要转一圈。

    3. 对于某个点,可以存在回路(只要方向不同)

    这导致回溯最短路径时,需要存储额外的信息来判断是否到达起点。udebug中有几个例子挺好,可以实验一下。

    我的代码可以AC,但有点冗余。

    AC代码

    1. #include
    2. #include
    3. #include
    4. #define MAXN 12
    5. using namespace std;
    6. const int LT[4] = {-1, 0, 1, 0};
    7. const int RT[4] = {0, 1, 0, -1};
    8. struct NodePath {
    9. int l, r;
    10. int dir, dirold;
    11. };
    12. // 结点来源
    13. NodePath prevArr[MAXN][MAXN][5];
    14. // 结点允许走的路
    15. bool pathArr[MAXN][MAXN][5][5];
    16. int begl, begr, endl, endr, dirbeg;
    17. int dir2int(char c) {
    18. switch(c) {
    19. case 'N': return 0;
    20. case 'E': return 1;
    21. case 'S': return 2;
    22. case 'W': return 3;
    23. }
    24. }
    25. int turn2int(char c) {
    26. switch(c) {
    27. case 'F': return 0;
    28. case 'L': return 3;
    29. case 'R': return 1;
    30. }
    31. }
    32. void inputNodes() {
    33. int l, r, dir;
    34. int i, j;
    35. char s[10];
    36. while(1) {
    37. scanf("%d %d", &l, &r);
    38. if(l == 0) {
    39. break;
    40. }
    41. while(scanf("%s", s) > 0) {
    42. if(s[0] == '*') {
    43. break;
    44. }
    45. dir = dir2int(s[0]);
    46. for(i = 1; s[i] != 0; ++i) {
    47. pathArr[l][r][dir][turn2int(s[i])] = true;
    48. }
    49. }
    50. }
    51. }
    52. void clear() {
    53. memset(prevArr, 0, sizeof(prevArr));
    54. memset(pathArr, 0, sizeof(pathArr));
    55. begl = 0;
    56. begr = 0;
    57. endl = 0;
    58. endr = 0;
    59. }
    60. NodePath createNodePath(int l ,int r, int dir, int i) {
    61. NodePath np;
    62. np.l = l + LT[(dir + i) % 4];
    63. np.r = r + RT[(dir + i) % 4];
    64. np.dir = (dir + i) % 4;
    65. np.dirold = dir;
    66. return np;
    67. }
    68. NodePath count(int dir) {
    69. queue qu;
    70. int i, j, k;
    71. qu.push(createNodePath(begl, begr, dir, 0));
    72. while(!qu.empty()) {
    73. NodePath np = qu.front();
    74. qu.pop();
    75. if(np.l == endl && np.r == endr) {
    76. return np;
    77. }
    78. for(i = 0; i < 4; ++i) {
    79. if(pathArr[np.l][np.r][np.dir][i]) {
    80. NodePath npw = createNodePath(np.l, np.r, np.dir, i);
    81. if(prevArr[npw.l][npw.r][npw.dir].l) {
    82. continue;
    83. }
    84. prevArr[npw.l][npw.r][npw.dir] = np;
    85. qu.push(npw);
    86. }
    87. }
    88. }
    89. return {0, 0, 0, 0};
    90. }
    91. NodePath getPrevPath(NodePath np) {
    92. np = prevArr[np.l][np.r][np.dir];
    93. return np;
    94. }
    95. void countRouter(vector &v, NodePath np) {
    96. while(np.l != 0 && (np.l != begl || np.r != begr || np.dir != dirbeg || np.dirold != dirbeg)) {
    97. v.push_back(np);
    98. np = getPrevPath(np);
    99. }
    100. v.push_back({
    101. begl, begr
    102. });
    103. }
    104. void output(vector &v) {
    105. NodePath np;
    106. int i, j;
    107. for(i = 0; i < v.size() / 2; ++i) {
    108. np = v[i];
    109. v[i] = v[v.size() - i - 1];
    110. v[v.size() - i - 1] = np;
    111. }
    112. printf(" ");
    113. for(i = 0; i < v.size(); ++i) {
    114. if(i != 0 && i % 10 == 0) {
    115. printf("\n ");
    116. }
    117. if(i != 0) {
    118. putchar(' ');
    119. }
    120. printf("(%d,%d)", v[i].l, v[i].r);
    121. }
    122. printf("\n");
    123. }
    124. int main() {
    125. char s[30];
    126. char dir[10];
    127. while(scanf("%s", s) > 0) {
    128. if(strcmp(s, "END") == 0) {
    129. break;
    130. }
    131. clear();
    132. scanf("%d %d %s %d %d", &begl, &begr, dir, &endl, &endr);
    133. dirbeg = dir2int(dir[0]);
    134. inputNodes();
    135. printf("%s\n", s);
    136. NodePath np = count(dirbeg);
    137. if(np.l == 0) {
    138. printf(" No Solution Possible\n");
    139. continue;
    140. }
    141. vector v;
    142. countRouter(v, np);
    143. output(v);
    144. }
    145. return 0;
    146. }

  • 相关阅读:
    [附源码]SSM计算机毕业设计校园超市进销存管理系统JAVA
    Vuex、localStorage和sessionStorage:如何选择合适的数据存储方式?
    健身耳机哪个好,运动最佳的几款耳机推荐
    JVM调优篇:探索Java性能优化的必备种子面试题
    【无线网络技术】——无线传输技术基础(学习笔记)
    基于OpenVINOTM开发套件“无缝”部署PaddleNLP模型
    .net 转 JAVA ssm java整合
    【kafka】springboot工程能发消息,不能收消息
    ClickHouse中“大列”造成的JOIN的内存超限问题
    ios xcode15 navigationController?.navigationBar.isHidden = false无效
  • 原文地址:https://blog.csdn.net/qq278672818/article/details/126438500