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
  • 相关阅读:
    document.getElementById("mytxt").style.left=""style.left在IE的FF中注意
    asp.net 用户控件中 使用相对路径的解决方法 图片路径问题(用户控件、图片路径) ,ResolveUrl
    探索 Block (一) (手把手讲解Block 底层实现原理)
    iOS 多线程开发 (概念与API简介)
    iOS 性能小点
    iOS runtime (二)(runtime学习之AutoCoding源码分析)
    探索 NSRunLoop (二)(NSRunLoop 自己动手实现SimpleRunLoop)
    iOS NSNotificationCenter (自己实现一个通知中心XMCNotificationCenter)
    iOS runtime (三)(runtime学习之YYModel源码分析)
    iOS runtime(一)(runtime 分析理解)
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8503978.html
Copyright © 2011-2022 走看看