算法训练 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

 

posted @ 2018-03-04 10:32  最美遇见你  阅读(197)  评论(0编辑  收藏  举报