当前位置:   article > 正文

学习总结2

学习总结2

解题思路

bfs进行搜索,标记A罐B罐所保存的水的出现情况,当再次出现的时候停止搜索,然后用数组模拟链表进行保存路径.最后输出.

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <fstream>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <deque>
  7. #include <vector>
  8. #include <queue>
  9. #include <string>
  10. #include <cstring>
  11. #include <map>
  12. #include <stack>
  13. #include <set>
  14. using namespace std;
  15. int g[120][120];
  16. struct s
  17. {
  18. int x;
  19. int y;
  20. }d[120*120];
  21. int l,r;
  22. struct ss
  23. {
  24. int x;
  25. int y;
  26. int z;
  27. }j[120][120];
  28. int a,b,c;
  29. int k,i;
  30. int bfs()
  31. {
  32. int tx,ty,z;
  33. while(l<r)
  34. {
  35. for(z=0;z<6;z++)
  36. {
  37. tx=d[l].x;
  38. ty=d[l].y;
  39. switch(z)
  40. {
  41. case 0:tx=a;break;
  42. case 1:ty=b;break;
  43. case 2:tx=0;break;
  44. case 3:ty=0;break;
  45. case 4:
  46. if(tx!=0)
  47. {
  48. if(tx+ty<=b)
  49. {
  50. ty=tx+ty;
  51. tx=0;
  52. }
  53. else
  54. {
  55. tx=tx-(b-ty);
  56. ty=b;
  57. }
  58. }
  59. break;
  60. case 5:
  61. if(ty!=0)
  62. {
  63. if(tx+ty<=a)
  64. {
  65. tx=ty+tx;
  66. ty=0;
  67. }
  68. else
  69. {
  70. ty=ty-(a-tx);
  71. tx=a;
  72. }
  73. }
  74. break;
  75. }
  76. if(tx>a||ty>b||tx<0||ty<0)
  77. continue;
  78. if(tx==c||ty==c)
  79. {
  80. k=tx;
  81. i=ty;
  82. j[k][i].x=d[l].x;
  83. j[k][i].y=d[l].y;
  84. j[k][i].z=z;
  85. g[tx][ty]=g[d[l].x][d[l].y]+1;
  86. return 0;
  87. }
  88. if(g[tx][ty]==-1)
  89. {
  90. g[tx][ty]=g[d[l].x][d[l].y]+1;
  91. d[r].x=tx;
  92. d[r++].y=ty;
  93. j[tx][ty].x=d[l].x;
  94. j[tx][ty].y=d[l].y;
  95. j[tx][ty].z=z;
  96. }
  97. }
  98. l++;
  99. }
  100. return 0;
  101. }
  102. void print(int x,int y)
  103. {
  104. if(x==0&&y==0)
  105. return ;
  106. print(j[x][y].x,j[x][y].y);
  107. switch(j[x][y].z)
  108. {
  109. case 0:printf("FILL(1)\n");break;
  110. case 1:printf("FILL(2)\n");break;
  111. case 2:printf("DROP(1)\n");break;
  112. case 3:printf("DROP(2)\n");break;
  113. case 4:printf("POUR(1,2)\n");break;
  114. case 5:printf("POUR(2,1)\n");break;
  115. }
  116. return ;
  117. }
  118. int main()
  119. {
  120. scanf("%d%d%d",&a,&b,&c);
  121. d[r].x=0;
  122. d[r++].y=0;
  123. memset(g,-1,sizeof(int )*120*120);
  124. g[0][0]=0;
  125. bfs();
  126. if(k==0&&i==0)
  127. {
  128. printf("impossible\n");
  129. }
  130. else
  131. {
  132. printf("%d\n",g[k][i]);
  133. print(k,i);
  134. }
  135. return 0;
  136. }

解题思路

这道题用bfs就行了.以两个人为起点对全图进行搜索,用一个数组保存到每一个地方所用的最短的步数.最后比较两人到所有的kfc所用的步数的总和输出最小的就行了.

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <fstream>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <deque>
  7. #include <vector>
  8. #include <queue>
  9. #include <string>
  10. #include <cstring>
  11. #include <map>
  12. #include <stack>
  13. #include <set>
  14. using namespace std;
  15. char g[210][210];
  16. int j[210][210];
  17. int j2[210][210];
  18. int ne[5][2]={{1,0},{-1,0},{0,1},{0,-1}};
  19. int n,m;
  20. struct di
  21. {
  22. int x;
  23. int y;
  24. }sy,sm,kfc[210*210],dl[210*210];
  25. int l,r;
  26. int k;
  27. int sum;
  28. int bfs()
  29. {
  30. int tx,ty,z;
  31. while(l<r)
  32. {
  33. for(z=0;z<4;z++)
  34. {
  35. tx=ne[z][0]+dl[l].x;
  36. ty=ne[z][1]+dl[l].y;
  37. if(tx<0||tx>n||ty<0||ty>m)
  38. continue;
  39. if(g[tx][ty]!='#'&&j[tx][ty]==0)
  40. {
  41. j[tx][ty]=j[dl[l].x][dl[l].y]+1;
  42. dl[r].x=tx;
  43. dl[r++].y=ty;
  44. }
  45. }
  46. l++;
  47. }
  48. return 0;
  49. }
  50. int bfs2()
  51. {
  52. int tx,ty,z;
  53. while(l<r)
  54. {
  55. for(z=0;z<4;z++)
  56. {
  57. tx=ne[z][0]+dl[l].x;
  58. ty=ne[z][1]+dl[l].y;
  59. if(tx<0||tx>n||ty<0||ty>m)
  60. continue;
  61. if(g[tx][ty]!='#'&&j2[tx][ty]==0)
  62. {
  63. j2[tx][ty]=j2[dl[l].x][dl[l].y]+1;
  64. dl[r].x=tx;
  65. dl[r++].y=ty;
  66. }
  67. }
  68. l++;
  69. }
  70. return 0;
  71. }
  72. int main()
  73. {
  74. int x,y,s;
  75. while(~scanf("%d%d",&n,&m))
  76. {
  77. sum=9999999;
  78. k=0;
  79. for(x=0;x<n;x++)
  80. {
  81. scanf("%s",g[x]);
  82. }
  83. for(x=0;x<n;x++)
  84. {
  85. for(y=0;y<m;y++)
  86. {
  87. if(g[x][y]=='Y')
  88. {
  89. sy.x=x;
  90. sy.y=y;
  91. }
  92. if(g[x][y]=='M')
  93. {
  94. sm.x=x;
  95. sm.y=y;
  96. }
  97. if(g[x][y]=='@')
  98. {
  99. kfc[k].x=x;
  100. kfc[k++].y=y;
  101. }
  102. }
  103. }
  104. memset(j,0,sizeof(int)*210*210);
  105. l=0;
  106. r=0;
  107. dl[r].x=sy.x;
  108. dl[r++].y=sy.y;
  109. bfs();
  110. memset(j2,0,sizeof(int)*210*210);
  111. l=0;
  112. r=0;
  113. dl[r].x=sm.x;
  114. dl[r++].y=sm.y;
  115. bfs2();
  116. for(x=0;x<k;x++)
  117. {
  118. if(j[kfc[x].x][kfc[x].y]!=0&&j2[kfc[x].x][kfc[x].y]!=0)
  119. if((j[kfc[x].x][kfc[x].y]+j2[kfc[x].x][kfc[x].y])<sum)
  120. sum=j[kfc[x].x][kfc[x].y]+j2[kfc[x].x][kfc[x].y];
  121. }
  122. printf("%d\n",sum*11);
  123. }
  124. return 0;
  125. }

解题思路

用bfs搜索,要注意的是地图是三维的,传送到下一层之后可能的情况(直接见到公主,撞死,进入另一个传送门).

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <fstream>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <deque>
  7. #include <vector>
  8. #include <queue>
  9. #include <string>
  10. #include <cstring>
  11. #include <map>
  12. #include <stack>
  13. #include <set>
  14. using namespace std;
  15. char g[3][15][15];
  16. int j[3][15][15];
  17. struct ss
  18. {
  19. int x;
  20. int y;
  21. int z;
  22. }d[15*15*3];
  23. int ne[5][2]={{1,0},{-1,0},{0,1},{0,-1}};
  24. int l,r;
  25. int n,m,t;
  26. int bfs()
  27. {
  28. int z,tx,ty,tz;
  29. while(l<r)
  30. {
  31. for(int z=0;z<4;z++)
  32. {
  33. tx=d[l].x+ne[z][0];
  34. ty=d[l].y+ne[z][1];
  35. tz=d[l].z;
  36. if(tx<0||ty<0||tx>=n||ty>=m)
  37. continue;
  38. if(g[tz][tx][ty]=='P')
  39. {
  40. return j[tz][tx][ty]=j[d[l].z][d[l].x][d[l].y]+1;
  41. }
  42. if(g[tz][tx][ty]!='*'&&j[tz][tx][ty]==-1)
  43. {
  44. j[tz][tx][ty]=j[d[l].z][d[l].x][d[l].y]+1;
  45. if(g[tz][tx][ty]=='#')
  46. {
  47. if(tz==0)
  48. {
  49. tz++;
  50. }
  51. else
  52. {
  53. tz--;
  54. }
  55. if(g[tz][tx][ty]=='#'||j[tz][tx][ty]!=-1)
  56. {
  57. if(tz==0)
  58. {
  59. tz++;
  60. }
  61. else
  62. {
  63. tz--;
  64. }
  65. continue;
  66. }
  67. if(g[tz][tx][ty]=='*'||j[tz][tx][ty]!=-1)
  68. {
  69. if(tz==0)
  70. {
  71. tz++;
  72. }
  73. else
  74. {
  75. tz--;
  76. }
  77. continue;
  78. }
  79. if(g[tz][tx][ty]=='P')
  80. {
  81. return j[tz][tx][ty]=j[d[l].z][d[l].x][d[l].y]+1;
  82. }
  83. j[tz][tx][ty]=j[d[l].z][d[l].x][d[l].y]+1;
  84. }
  85. d[r].x=tx;
  86. d[r].y=ty;
  87. d[r++].z=tz;
  88. }
  89. }
  90. l++;
  91. }
  92. return 999999;
  93. }
  94. int main()
  95. {
  96. int k;
  97. scanf("%d",&k);
  98. for(int z=0;z<k;z++)
  99. {
  100. memset(j,-1,sizeof(int )*3*15*15);
  101. l=r=0;
  102. scanf("%d%d%d",&n,&m,&t);
  103. for(int x=0;x<n;x++)
  104. {
  105. scanf("%s",g[0][x]);
  106. }
  107. getchar();
  108. for(int x=0;x<n;x++)
  109. {
  110. scanf("%s",g[1][x]);
  111. }
  112. d[r].x=0;
  113. d[r].y=0;
  114. d[r++].z=0;
  115. j[0][0][0]=0;
  116. int sum=bfs();
  117. if(sum<=t)
  118. {
  119. printf("YES\n");
  120. }
  121. else
  122. {
  123. printf("NO\n");
  124. }
  125. }
  126. return 0;
  127. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号