AcWing 1100. 抓住那头牛

谁借莪1个温暖的怀抱¢ 2024-04-08 13:17 211阅读 0赞

AcWing 1100. 抓住那头牛

原题链接

AcWing 1100. 抓住那头牛

算法标签

BFS

思路

BFS可以求解对于边权为1图的最短路

移动过程中,移动至最短路所经过的点的合法范围
若从 X X X 移动到 X + 1 X+1 X+1
说明移动前位于牛的前方 则移动后到达牛的位置或依旧位于牛的前方 即X+1<=K
若从 X X X 移动到 X ∗ 2 X*2 X∗2
说明移动前位于牛的前方 则移动后到达牛的位置或依旧位于牛的前方 即X+2<=K
若 从 X X X 移动到 X − 1 X−1 X−1
情况1
移动前位于牛的后方 则移动后到达牛的位置或依旧位于牛的后方 即X-1>=K
情况2
为方便从 X X X 移动到 X ∗ 2 X*2 X∗2
移动前位于牛的前方 则移动后依旧位于牛的前方 即X-1<K

我的代码

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define rep(i, a, b) for(int i=a;i<b;++i)
  4. #define Rep(i, a, b) for(int i=a;i>b;--i)
  5. #define x first
  6. #define y second
  7. using namespace std;
  8. typedef pair<int, int> PII;
  9. const int N = 100005;
  10. int d[N];
  11. int q[N];
  12. int n, k;
  13. inline int read(){
  14. int s=0,w=1;
  15. char ch=getchar();
  16. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  17. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  18. return s*w;
  19. }
  20. void put(int x) {
  21. if(x<0) putchar('-'),x=-x;
  22. if(x>=10) put(x/10);
  23. putchar(x%10^48);
  24. }
  25. int bfs(){
  26. int hh=0, tt=0;
  27. memset(d, -1, sizeof d);
  28. q[0]=n;
  29. d[n]=0;
  30. while(hh<=tt){
  31. int t=q[hh++];
  32. if(t==k){
  33. return d[k];
  34. }
  35. if(t+1<=k&&d[t+1]==-1){
  36. d[t+1]=d[t]+1;
  37. q[++tt]=t+1;
  38. }
  39. if(t-1>=k&&d[t-1]==-1){
  40. d[t-1]=d[t]+1;
  41. q[++tt]=t-1;
  42. }
  43. if(t-1<k&&d[t-1]==-1){
  44. d[t-1]=d[t]+1;
  45. q[++tt]=t-1;
  46. }
  47. if(t*2<=k*2&&d[t*2]==-1){
  48. d[t*2]=d[t]+1;
  49. q[++tt]=t*2;
  50. }
  51. }
  52. }
  53. signed main(){
  54. ios::sync_with_stdio(false);
  55. cin.tie(0);
  56. cout.tie(0);
  57. n=read(), k=read();
  58. printf("%lld", bfs());
  59. return 0;
  60. }

y总代码
可以不进行细致分析 得出可能范围即可

  1. #include<bits/stdc++.h>
  2. #define int long long
  3. #define rep(i, a, b) for(int i=a;i<b;++i)
  4. #define Rep(i, a, b) for(int i=a;i>b;--i)
  5. #define x first
  6. #define y second
  7. using namespace std;
  8. typedef pair<int, int> PII;
  9. const int N = 200005;
  10. int d[N];
  11. int q[N];
  12. int n, k;
  13. inline int read(){
  14. int s=0,w=1;
  15. char ch=getchar();
  16. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  17. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  18. return s*w;
  19. }
  20. void put(int x) {
  21. if(x<0) putchar('-'),x=-x;
  22. if(x>=10) put(x/10);
  23. putchar(x%10^48);
  24. }
  25. int bfs(){
  26. int hh=0, tt=0;
  27. memset(d, -1, sizeof d);
  28. // 起始点入队
  29. q[0]=n;
  30. // 起始点距离为零
  31. d[n]=0;
  32. while(hh<=tt){
  33. int t=q[hh++];
  34. // 抓住位于点 K的牛
  35. if(t==k){
  36. return d[k];
  37. }
  38. // 若向后移动后位于范围内且尚未走过
  39. if(t+1<N&&d[t+1]==-1){
  40. d[t+1]=d[t]+1;
  41. q[++tt]=t+1;
  42. }
  43. // 若向前移动后位于范围内且尚未走过
  44. if(t-1>=0&&d[t-1]==-1){
  45. d[t-1]=d[t]+1;
  46. q[++tt]=t-1;
  47. }
  48. // 若移动至t*2位于范围内且尚未走过
  49. if(t*2<=N&&d[t*2]==-1){
  50. d[t*2]=d[t]+1;
  51. q[++tt]=t*2;
  52. }
  53. }
  54. }
  55. signed main(){
  56. ios::sync_with_stdio(false);
  57. cin.tie(0);
  58. cout.tie(0);
  59. n=read(), k=read();
  60. printf("%lld", bfs());
  61. return 0;
  62. }

参考文献
AcWing 1100. 抓住那头牛y总代码
AcWing 1100. 抓住那头牛y总视频讲解

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

发表评论

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

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

相关阅读

    相关 1100 校庆

    2019 年浙江大学将要庆祝成立 122 周年。为了准备校庆,校友会收集了所有校友的身份证号。现在需要请你编写程序,根据来参加校庆的所有人士的身份证号,统计来了多少校友。

    相关 TJU1100

    问题的本质是对于4个数组,每一个数组求一个分拆使两部分差最小。典型的DP。不过当时做的时候DP还学得不咋地,所以还是用搜索的办法~~还好也ac了 ![None.gif]