POJ 3278 Catch That Cow (BFS)

客官°小女子只卖身不卖艺 2022-05-17 22:25 252阅读 0赞

题意:给你两个数N(代表农夫John)和K(他的奶牛的位置) John每次有三种移动方式 1.向左移动一格 2.向右移动一格 3.移动到现在位置的2倍下标的位置,奶牛是静止的,问你John最少需要多少步走到奶牛所在的位置。

分析:因为是求最少的步数,所以直接可以用BFS来求解 这题在复习的时候又写了一次一直RE,想了好久,最后发现了一个问题,如果是先判断当前下标是否标记的话,则需要将数组的大小开到题目要求的二倍,但如果是先判断是否越界的话,对于&&运算,当前面不成立的时候就不会执行后面的运算了,所以如果是先判断是否越界的话就不会RE。

  1. #include<map>
  2. #include<set>
  3. #include<cmath>
  4. #include<queue>
  5. #include<stack>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<utility>
  9. #include<cctype>
  10. #include<cstring>
  11. #include<cstdlib>
  12. #include<iostream>
  13. #include<algorithm>
  14. #define inf 0x3f3f3f3f
  15. #define Clear(x) memset(x,0,sizeof(x))
  16. #define fup(i,a,b) for(int i=a;i<b;i++)
  17. #define rfup(i,a,b) for(int i=a;i<=b;i++)
  18. #define fdn(i,a,b) for(int i=a;i>b;i--)
  19. #define rfdn(i,a,b) for(int i=a;i>=b;i--)
  20. typedef long long ll;
  21. using namespace std;
  22. const double pi=acos(-1.0);
  23. const int maxn = 1e5+5;
  24. int N,K;
  25. int vis[maxn];
  26. struct node{
  27. int x,step;
  28. };
  29. node vs,zb,nzb;
  30. int BFS()
  31. {
  32. Clear(vis);
  33. queue<node>q;
  34. while(!q.empty()) q.pop();
  35. vs.x=N,vs.step=0;
  36. vis[N]=1;
  37. q.push(vs);
  38. while(!q.empty())
  39. {
  40. zb = q.front();
  41. q.pop();
  42. if(zb.x==K) return zb.step;
  43. if(zb.x-1>=0&&!vis[zb.x-1])
  44. {
  45. vis[zb.x-1] = 1;
  46. nzb.x = zb.x-1;
  47. nzb.step = zb.step+1;
  48. q.push(nzb);
  49. }
  50. if(zb.x+1<=100000&&!vis[zb.x+1])
  51. {
  52. vis[zb.x+1] = 1;
  53. nzb.x = zb.x+1;
  54. nzb.step = zb.step+1;
  55. q.push(nzb);
  56. }
  57. if(zb.x*2<=100000&&!vis[zb.x*2])
  58. {
  59. vis[zb.x*2] = 1;
  60. nzb.x = zb.x*2;
  61. nzb.step = zb.step +1;
  62. q.push(nzb);
  63. }
  64. }
  65. return 0;
  66. }
  67. int main()
  68. {
  69. while(scanf("%d%d",&N,&K)==2)
  70. {
  71. printf("%d\n",BFS());
  72. }
  73. return 0;
  74. }

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读