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.
     
    #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;
            }
        }
    }
    View Code
  • 相关阅读:
    解决点击链接自动置顶问题
    ie6 下遮罩层 height 不显示100%的解决方法
    【转帖】微软分布式缓存框架Volocity资源推荐
    Tips 2 MVC实现多个按钮提交的几种方法
    .NET Framework 4 中的新增功能
    Memcached 汇总 不断更新
    理解敏捷Agile
    GPIOPS中断成功,问题仍旧存在 ZEDBOARD,ZYNQ7000
    Xilinx驱动API的一个重要BUG,ZEDBOARD,ZYNQ7000
    RelativeLayout相对布局
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8503978.html
Copyright © 2011-2022 走看看