• 22/7/20


    1,Dragon slayer;2,Alice and Bod;3,Laser;


    1,Dragon slayer;

    题意:给出英雄坐标和恶龙坐标还有一些墙的两个端点(墙是一条线),英雄碰到墙需要用魔法穿过,并使得该墙消失,问到达恶龙需要最少几次魔法;

    英雄坐标和恶龙坐标(x,y)都需+0.5;也就是在格中;第一次碰到这样的形式,被卡住了了;

    题解的表示就是把纵墙都放到格子左边的线上,横墙都放到格子下边的线上;这样人物在上下左右移动是,就可以判断如何穿过来的;(这个点还是要掌握一下);

    做法:枚举墙的状态,然后根据墙的状态走地图,能走到,则更新答案;

    枚举状态可以dfs递归枚举,也可以状态压缩枚举;

    走地图bfs,dfs均可;

    我用的是dfs枚举+bfs走地图;(dfs枚举时可以优化搜索顺序和最优性剪枝);

    代码:

    1. #pragma GCC optimize(2)
    2. #include
    3. #define rep1(i,a,n) for( int i=(a);i<(n);++i)
    4. #define rep2(i,a,n) for( int i=(a);i<=(n);++i)
    5. #define per1(i,n,a) for( int i=(n);i>(a);i--)
    6. #define per2(i,n,a) for( int i=(n);i>=(a);i--)
    7. #define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
    8. #define memset(a,i,b) memset((a),(i),sizeof (b))
    9. #define memcpy(a,i,b) memcpy((a),(i),sizeof (b))
    10. #define pro_q priority_queue
    11. #define pb push_back
    12. #define pf push_front
    13. #define endl "\n"
    14. #define lowbit(m) ((-m)&(m))
    15. #define dbug(y) cout<<(#y)<<"\n"
    16. #define yi first
    17. #define er second
    18. #define INF 0x3f3f3f3f
    19. #define tulun int e[N],ne[N],h[N],w[N],idx;
    20. #define add2(a,b) e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    21. #define add3(a,b,c) w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    22. #define T_solve() int T;cin>>T;while(T--)solve();
    23. #define pi 3.14159265358979323846
    24. using namespace std;
    25. typedef long long LL;
    26. typedef pair<int,int> PII;
    27. typedef pairint,int>,pair<int,int>>PIIII;
    28. typedef pair<long long,long long> PLL;
    29. typedef double dob;
    30. typedef pair PDD;
    31. const int N=20;
    32. struct node
    33. {
    34. int x1,y1,x2,y2;
    35. }wall[N];
    36. int mp[N][N];
    37. int st_wall[N];
    38. int L_wall[N][N],D_wall[N][N];
    39. int n,m,k,x3,y3,xt,yt;
    40. int ans=INF;
    41. PII q[N*N];
    42. bool bfs()
    43. {
    44. memset(mp,0,mp);
    45. memset(L_wall,0,L_wall);
    46. memset(D_wall,0,D_wall);
    47. int hh=0,tt=0;
    48. q[0]={x3,y3};
    49. mp[x3][y3]=1;
    50. rep1(i,0,k)
    51. {
    52. if(st_wall[i])
    53. {
    54. int x1=wall[i].x1,x2=wall[i].x2,y1=wall[i].y1,y2=wall[i].y2;
    55. if(x1==x2)
    56. {
    57. rep1(col,y1,y2)
    58. {
    59. L_wall[x1][col]=1;
    60. }
    61. }
    62. else
    63. {
    64. rep1(row,x1,x2)
    65. {
    66. D_wall[row][y1]=1;
    67. }
    68. }
    69. }
    70. }
    71. while (hh<=tt)
    72. {
    73. auto s=q[hh++];
    74. int x=s.first,y=s.second;
    75. if(x==xt&&y==yt)
    76. {
    77. return 1;
    78. }
    79. if(x>=1&&L_wall[x][y]==0&&!mp[x-1][y])
    80. {
    81. q[++tt]={x-1,y};
    82. mp[x-1][y]=1;
    83. }
    84. if(x+11][y]==0&&!mp[x+1][y])
    85. {
    86. q[++tt]={x+1,y};
    87. mp[x+1][y]=1;
    88. }
    89. if(y>=1&&D_wall[x][y]==0&&!mp[x][y-1])
    90. {
    91. q[++tt]={x,y-1};
    92. mp[x][y-1]=1;
    93. }
    94. if(y+11]==0&&!mp[x][y+1])
    95. {
    96. q[++tt]={x,y+1};
    97. mp[x][y+1]=1;
    98. }
    99. }
    100. return 0;
    101. }
    102. void dfs(int u,int num)
    103. {
    104. if(num>=ans)return;
    105. if(u==k)
    106. {
    107. if(bfs())ans=num;
    108. return;
    109. }
    110. st_wall[u]=1;//墙存在;
    111. dfs(u+1,num);
    112. st_wall[u]=0;//墙不存在;
    113. dfs(u+1,num+1);
    114. }
    115. void solve()
    116. {
    117. cin>>n>>m>>k>>x3>>y3>>xt>>yt;
    118. ans=INF;
    119. memset(st_wall,0,st_wall);
    120. rep1(i,0,k)
    121. {
    122. int x1,y1,x2,y2;
    123. cin>>x1>>y1>>x2>>y2;
    124. if(x1==x2)
    125. {
    126. if(y1>y2)swap(y1,y2);
    127. wall[i]={x1,y1,x2,y2};
    128. }
    129. else
    130. {
    131. if(x1>x2)swap(x1,x2);
    132. wall[i]={x1,y1,x2,y2};
    133. }
    134. }
    135. dfs(0,0);
    136. cout<
    137. }
    138. signed main()
    139. {
    140. quick_cin();
    141. T_solve();
    142. return 0;
    143. }

    2,Alice and Bob

    思路:从2个1开始发现A必赢,然后4个2就必能得出2个1,同理8个3必能得出4个2,。。但是对于2 2 2 3 3来说,A也是必赢的,由此可以得出,后面的数对前面数的贡献个数是ai/2,最终只要推出来有0,A就赢,否则就是Bob;

    1. #pragma GCC optimize(2)
    2. #include
    3. #define rep1(i,a,n) for( int i=(a);i<(n);++i)
    4. #define rep2(i,a,n) for( int i=(a);i<=(n);++i)
    5. #define per1(i,n,a) for( int i=(n);i>(a);i--)
    6. #define per2(i,n,a) for( int i=(n);i>=(a);i--)
    7. #define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
    8. #define memset(a,i,b) memset((a),(i),sizeof (b))
    9. #define memcpy(a,i,b) memcpy((a),(i),sizeof (b))
    10. #define pro_q priority_queue
    11. #define pb push_back
    12. #define pf push_front
    13. #define endl "\n"
    14. #define lowbit(m) ((-m)&(m))
    15. #define dbug(y) cout<<(#y)<<"\n"
    16. #define yi first
    17. #define er second
    18. #define INF 0x3f3f3f3f
    19. #define tulun int e[N],ne[N],h[N],w[N],idx;
    20. #define add2(a,b) e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    21. #define add3(a,b,c) we[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    22. #define T_solve() int T;cin>>T;while(T--)solve();
    23. #define pi 3.14159265358979323846
    24. using namespace std;
    25. typedef long long LL;
    26. typedef pair<int,int> PII;
    27. typedef pairint,int>,pair<int,int>>PIIII;
    28. typedef pair<long long,long long> PLL;
    29. typedef double dob;
    30. typedef pair PDD;
    31. const int N=1e6+10;
    32. int a[N];
    33. int n;
    34. void solve()
    35. {
    36. cin>>n;
    37. rep2(i,0,n)cin>>a[i];
    38. per2(i,n,1)
    39. {
    40. a[i-1]+=a[i]/2;
    41. }
    42. if(a[0])dbug(Alice);
    43. else dbug(Bob);
    44. }
    45. signed main()
    46. {
    47. quick_cin();
    48. T_solve();
    49. return 0;
    50. }

    3,Laser;

    首先拿一个点在他所在的横线上找,找到第一个不在该线上的点,那么通过该点,可以确定答案一定在该点能延伸的情况与横线的3个交点上;

     如图所示;

    然后所在横线可以是x,可以是y也可以是两条斜对角线;

    把4种情况都枚举出来,然后枚举每种情况找出来的3点;

    1. #pragma GCC optimize(2)
    2. #include
    3. #define rep1(i,a,n) for( int i=(a);i<(n);++i)
    4. #define rep2(i,a,n) for( int i=(a);i<=(n);++i)
    5. #define per1(i,n,a) for( int i=(n);i>(a);i--)
    6. #define per2(i,n,a) for( int i=(n);i>=(a);i--)
    7. #define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
    8. #define memset(a,i,b) memset((a),(i),sizeof (b))
    9. #define memcpy(a,i,b) memcpy((a),(i),sizeof (b))
    10. #define pro_q priority_queue
    11. #define pb push_back
    12. #define pf push_front
    13. #define endl "\n"
    14. #define lowbit(m) ((-m)&(m))
    15. #define dbug(y) cout<<(#y)<<"\n"
    16. #define yi first
    17. #define er second
    18. #define INF 0x3f3f3f3f
    19. #define tulun int e[N],ne[N],h[N],w[N],idx;
    20. #define add2(a,b) e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    21. #define add3(a,b,c) we[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    22. #define T_solve() int T;cin>>T;while(T--)solve();
    23. #define pi 3.14159265358979323846
    24. using namespace std;
    25. typedef long long LL;
    26. typedef pair<int,int> PII;
    27. typedef pairint,int>,pair<int,int>>PIIII;
    28. typedef pair<long long,long long> PLL;
    29. typedef double dob;
    30. typedef pair PDD;
    31. const int N=1e5+10;
    32. int a[N],b[N],x[N],y[N];
    33. int n;
    34. bool pd(int x,int y)
    35. {
    36. if(!x||!y||x==y||x+y==0)return 1;
    37. return 0;
    38. }
    39. bool check(int xx,int yy)
    40. {
    41. rep2(i,1,n)
    42. {
    43. if(!pd(xx-x[i],yy-y[i]))return 0;
    44. }
    45. return 1;
    46. }
    47. bool check()
    48. {
    49. int f=1;
    50. rep2(i,2,n)
    51. {
    52. if(x[i]==x[1])continue;
    53. f=0;
    54. if(check(x[1],y[i]))return 1;
    55. if(check(x[1],y[i]+(x[i]-x[1])))return 1;
    56. if(check(x[1],y[i]-(x[i]-x[1])))return 1;
    57. break;
    58. }
    59. if(f)return 1;
    60. return 0;
    61. }
    62. void solve()
    63. {
    64. cin>>n;
    65. rep2(i,1,n)cin>>a[i]>>b[i];
    66. rep2(i,1,n)x[i]=a[i],y[i]=b[i];
    67. if(check())
    68. {
    69. dbug(YES);
    70. return;
    71. }
    72. rep2(i,1,n)x[i]=b[i],y[i]=a[i];
    73. if(check())
    74. {
    75. dbug(YES);
    76. return;
    77. }
    78. rep2(i,1,n)x[i]=a[i]+b[i],y[i]=a[i]-b[i];
    79. if(check())
    80. {
    81. dbug(YES);
    82. return;
    83. }
    84. rep2(i,1,n)x[i]=a[i]-b[i],y[i]=a[i]+b[i];
    85. if(check())
    86. {
    87. dbug(YES);
    88. return;
    89. }
    90. dbug(NO);
    91. }
    92. signed main()
    93. {
    94. quick_cin();
    95. T_solve();
    96. return 0;
    97. }

  • 相关阅读:
    DDD从入门到精通(请点赞收藏)
    uview组件使用笔记
    Android Material Design
    LLVM 与代码混淆技术
    交割合约(期货合约)是什么?
    Vue事件修饰符
    基于SSM的汽车客运站管理系统
    机器学习实战读书笔记——端到端的机器学习项目
    软件定制开发的步骤与注意事项|小程序搭建|APP定制
    Macos文件图像比较工具:Kaleidoscope for Mac
  • 原文地址:https://blog.csdn.net/aidaqiudeaichao/article/details/125889608