zoukankan      html  css  js  c++  java
  • 算法训练 Lift and Throw

     
    时间限制:3.0s   内存限制:256.0MB
        
    问题描述
      给定一条标有整点(1, 2, 3, ...)的射线. 定义两个点之间的距离为其下标之差的绝对值.
      Laharl, Etna, Flonne一开始在这条射线上不同的三个点, 他们希望其中某个人能够到达下标最大的点.
      每个角色只能进行下面的3种操作, 且每种操作不能每人不能进行超过一次.
      1.移动一定的距离
      2.把另一个角色高举过头
      3.将举在头上的角色扔出一段距离
      每个角色有一个movement range参数, 他们只能移动到没有人的位置, 并且起点和终点的距离不超过movement range.
      如果角色A和另一个角色B距离为1, 并且角色B没有被别的角色举起, 那么A就能举起B. 同时, B会移动到A的位置,B原来所占的位置变为没有人的位置. 被举起的角色不能进行任何操作, 举起别人的角色不能移动.同时, 每个角色还有一个throwing range参数, 即他能把举起的角色扔出的最远的距离. 注意, 一个角色只能被扔到没有别的角色占据的位置. 我们认为一个角色举起另一个同样举起一个角色的角色是允许的. 这种情况下会出现3个人在同一个位置的情况. 根据前面的描述, 这种情况下上面的两个角色不能进行任何操作, 而最下面的角色可以同时扔出上面的两个角色. 你的任务是计算这些角色能够到达的位置的最大下标, 即最大的数字x, 使得存在一个角色能够到达x.
    输入格式
      输入共三行, 分别为Laharl, Etna, Floone的信息.
      每一行有且仅有3个整数, 描述对应角色的初始位置, movement range, throwing range.
      数据保证3个角色的初始位置两两不相同且所有的数字都在1到10之间.</div>
    输出格式
      仅有1个整数, 即Laharl, Etna, Flonne之一能到达的最大距离.
    样例输入
    9 3 3
    4 3 1
    2 3 3
    样例输出
    15
    样例说明
      一开始Laharl在位置9, Etna在位置4, Flonne在位置2.
      首先, Laharl移动到6.
      然后Flonne移动到位置5并且举起Etna.
      Laharl举起Flonne将其扔到位置9.
      Flonne把Etna扔到位置12.
      Etna移动到位置15.
    /*
      通过80%数据测试,20%数据超时
    */
    #include<iostream> #include<cstring> #include<algorithm> using namespace std; int maxn=1,move[4],pos[4],th[4],on[4],under[4],vis[9],a[9]; void calc(int dep); int main(void){ for(int i=1;i<=3;i++) cin>>pos[i]>>move[i]>>th[i]; calc(0); cout<<maxn; return 0; } void calc(int dep){ int temp = max(pos[1],pos[2]); temp = max(temp,pos[3]); maxn = max(maxn,temp); if(dep == 9) return ; for(int i=0;i<9;i++){ if(!vis[i]){ vis[i] = 1; a[dep] = i; switch(a[dep]%3){ case 0://移动,包括走与不走的两种情况 if(a[dep]/3==0){ for(int i=-move[1];i<=move[1];i++) if(pos[1]+i != pos[2] && pos[1]+i != pos[3] && pos[1]+i >=1 && !under[1] && !on[1] ){ pos[1]=pos[1]+i; calc(dep+1); pos[1]=pos[1]-i; } } else if(a[dep]/3==1){ for(int i=-move[2];i<=move[2];i++) if(pos[2]+i != pos[1] && pos[2]+i != pos[3] && pos[2]+i >=1 && !under[2] && !on[2] ){ pos[2]=pos[2]+i; calc(dep+1); pos[2]=pos[2]-i; } } else{ for(int i=-move[3];i<=move[3];i++) if(pos[3]+i != pos[1] && pos[3]+i != pos[2] && pos[3]+i >=1 && !under[3] && !on[3] ){ pos[3]=pos[3]+i; calc(dep+1); pos[3]=pos[3]-i; } } break; case 1://扔出,包括走不走两种情况 if(a[dep]/3==0){ if(under[1]){ for(int i=-th[1];i<=th[1];i++){ if(on[2] == 1 && on[3] == 2 && pos[2]+i >= 1){ on[2] = 0; under[1] = 0; pos[2] = pos[3] = pos[2]+i; calc(dep+1); pos[2] = pos[3] = pos[2]-i; on[2] = 1; under[1] = 2; } else if(on[3] == 1 && on[2] == 3 && pos[3]+i >= 1){ on[3] = 0; under[1] = 0; pos[2] = pos[3] = pos[3]+i; calc(dep+1); pos[2] = pos[3] = pos[3]-i; on[3] = 1; under[1] = 3; } else if(on[2] == 1 && pos[2]+i >= 1 && pos[2]+i != pos[3]){ on[2] = 0; under[1] = 0; pos[2] = pos[2] + i; calc(dep+1); pos[2] = pos[2] - i; on[2] = 1; under[1] = 2; } else if(on[3] == 1 && pos[3]+i >= 1 && pos[3]+i != pos[2]){ on[3] = 0; under[1] = 0; pos[3] = pos[3] + i; calc(dep+1); pos[3] = pos[3] - i; on[3] = 1; under[1] = 3; } } } } else if(a[dep]/3==1){ if(under[2]){ for(int i=-th[2];i<=th[2];i++){ if(on[1] == 2 && on[3] == 1 && pos[1]+i >= 1){ on[1] = 0; under[2] = 0; pos[1] = pos[3] = pos[1]+i; calc(dep+1); pos[1] = pos[3] = pos[1]-i; on[1] = 2; under[2] = 1; } else if(on[3] == 2 && on[1] == 3 && pos[3]+i >= 1){ on[3] = 0; under[2] = 0; pos[1] = pos[3] = pos[3]+i; calc(dep+1); pos[1] = pos[3] = pos[3]-i; on[3] = 2; under[2] = 3; } else if(on[1] == 2 && pos[1]+i >= 1 && pos[1]+i != pos[3]){ on[1] = 0; under[2] = 0; pos[1] = pos[1] + i; calc(dep+1); pos[1] = pos[1] - i; on[1] = 2; under[2] = 1; } else if(on[3] == 2 && pos[3]+i >= 1 && pos[3]+i != pos[2]){ on[3] = 0; under[2] = 0; pos[3] = pos[3] + i; calc(dep+1); pos[3] = pos[3] - i; on[3] = 2; under[2] = 3; } } } } else{ if(under[3]){ for(int i=-th[3];i<=th[3];i++){ if(on[1] == 3 && on[2] == 1 && pos[1]+i >= 1){ on[1] = 0; under[3] = 0; pos[1] = pos[2] = pos[1]+i; calc(dep+1); pos[1] = pos[2] = pos[1]-i; on[1] = 3; under[3] = 1; } else if(on[2] == 3 && on[1] == 2 && pos[2]+i >= 1){ on[2] = 0; under[3] = 0; pos[1] = pos[2] = pos[2]+i; calc(dep+1); pos[1] = pos[2] = pos[2]-i; on[2] = 3; under[3] = 2; } else if(on[1] == 3 && pos[1]+i >= 1 && pos[1]+i != pos[2]){ on[1] = 0; under[3] = 0; pos[1] = pos[1] + i; calc(dep+1); pos[1] = pos[1] - i; on[1] = 3; under[3] = 1; } else if(on[2] == 3 && pos[2]+i >= 1 && pos[2]+i != pos[1]){ on[2] = 0; under[3] = 0; pos[2] = pos[2] + i; calc(dep+1); pos[2] = pos[2] - i; on[2] = 3; under[3] = 2; } } } } break; case 2://举起来,枚举两种情况 if(a[dep]/3==0){ if((pos[1] - pos[2] == 1 || pos[1] - pos[2] == -1 || pos[1] - pos[3] == 1 || pos[1] - pos[2] == -1) && !under[1] && !on[1]){ if(on[3] == 2){ on[2] = 1; under[1] = 2; int temp = pos[2]; pos[2] = pos[3] = pos[1]; calc(dep+1); on[2] = 0; under[1] = 0; pos[2] = pos[3] = temp; } else if(on[2] == 3){ on[3] = 1; under[1] = 3; int temp = pos[2]; pos[2] = pos[3] = pos[1]; calc(dep+1); on[3] = 0; under[1] = 0; pos[2] = pos[3] = temp; } else if(pos[1] - pos[2] == 1 || pos[1] - pos[2] == -1){ on[2] = 1; under[1] = 2; int temp = pos[2]; pos[2] = pos[1]; calc(dep+1); on[2] = 0; under[1] = 0; pos[2] = temp; } else if(pos[1] - pos[3] == 1 || pos[1] - pos[3] == -1){ on[3] = 1; under[1] = 3; int temp = pos[3]; pos[3] = pos[1]; calc(dep+1); on[3] = 0; under[1] = 0; pos[3] = temp; } } } else if(a[dep]/3==1){ if((pos[2] - pos[1] == 1 || pos[2] - pos[1] == -1 || pos[2] - pos[3] == 1 || pos[2] - pos[3] == -1) && !under[2] && !on[2]){ if(on[1] == 3){ on[3] = 2; under[2] = 3; int temp = pos[1]; pos[1] = pos[3] = pos[2]; calc(dep+1); on[3] = 0; under[2] = 0; pos[1] = pos[3] = temp; } else if(on[3] == 1){ on[1] = 2; under[2] = 3; int temp = pos[1]; pos[1] = pos[3] = pos[2]; calc(dep+1); on[1] = 0; under[2] = 0; pos[1] = pos[3] = temp; } else if(pos[2] - pos[3] == 1 || pos[2] - pos[3] == -1){ on[3] = 2; under[2] = 3; int temp = pos[3]; pos[3] = pos[2]; calc(dep+1); on[3] = 0; under[2] = 0; pos[3] = temp; } else if(pos[2] - pos[1] == 1 || pos[2] - pos[1] == -1){ on[1] = 2; under[2] = 1; int temp = pos[1]; pos[1] = pos[2]; calc(dep+1); on[1] = 0; under[2] = 0; pos[1] = temp; } } } else{ if((pos[3] - pos[1] == 1 || pos[3] - pos[1] == -1 || pos[3] - pos[2] == 1 || pos[3] - pos[2] == -1) && !under[3] && !on[3]){ if(on[1] == 2){ on[2] = 3; under[3] = 2; int temp = pos[1]; pos[1] = pos[2] = pos[3]; calc(dep+1); on[2] = 0; under[3] = 0; pos[1] = pos[2] = temp; } else if(on[2] == 1){ on[1] = 3; under[3] = 1; int temp = pos[1]; pos[1] = pos[2] = pos[3]; calc(dep+1); on[1] = 0; under[3] = 0; pos[1] = pos[2] = temp; } else if(pos[3] - pos[2] == 1 || pos[3] - pos[2] == -1){ on[2] = 3; under[3] = 2; int temp = pos[2]; pos[2] = pos[3]; calc(dep+1); on[2] = 0; under[3] = 0; pos[2] = temp; } else if(pos[3] - pos[1] == 1 || pos[3] - pos[1] == -1){ on[1] = 3; under[3] = 1; int temp = pos[1]; pos[1] = pos[3]; calc(dep+1); on[1] = 0; under[3] = 0; pos[1] = temp; } } } break; } vis[i] = 0; } } }
  • 相关阅读:
    jmeter接口测试3-正则表达式提取器的使用
    Sublime中Markdown的安装与使用
    python使用you-get模块下载视频
    python BeautifulSoup模块的简要介绍
    python Requests模块的简要介绍
    mongodb基本操作的学习
    python中的常用方法
    网盘的选择,百度网盘、google drive 还是 Dropbox
    python_爬虫一之爬取糗事百科上的段子
    pycharm的使用破解和Anaconda的使用
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8511671.html
Copyright © 2011-2022 走看看