阿里巴巴4.27笔试

1.维护前后左右四个数据。
    当右翻时,当前底部变为左侧,底部所对的位置变为右侧。
    当左翻时,当前底部变为右侧,底部所对的位置变为左侧。
    当前翻时,当前底部变为后侧,底部所对的位置变为前侧。
    当后翻时,当前底部变为前侧,底部所对的位置变为后侧。
    往哪个方向翻转,则下一个位置的值就是那个方向的数据。往前翻,就是当前前位置的数据。
 注意: 1和6相对
            5和2相对   
            3和4相对。
代码:
#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>,int>m;
map<int,int>t;
vector<pair<int,int>>dir{{0,1},{0,-1},{-1,0},{1,0}};
void init(){
    t[1]=6;
    t[6]=1;
    t[2]=5;
    t[5]=2;
    t[3]=4;
    t[4]=3;
    m[{0,1}]=2;
    m[{0,-1}]=5;
    m[{1,0}]=3;
    m[{-1,0}]=4;
}
void process(pair<int,int>start,vector<vector<char>>&nums){
    int n=nums.size();
    int now=6;
    queue<pair<int,int>>Q;
    Q.push(start);
    nums[start.first][start.second]=now+'0';
    while(!Q.empty()){
        auto p=Q.front();
        Q.pop();
        nums[p.first][p.second]=now+'0';
        for(auto d:dir){
            int x=d.first+p.first;
            int y=d.second+p.second;
            if(x>=0&&x<n&&y>=0&&y<n){
                if(nums[x][y]=='#'||nums[x][y]=='E'){
                    int bottom=now;
                    now=m[d];//转换一下
                    if(d.first==0&&d.second==1){//往右转换
                        m[{0,-1}]=bottom;
                        m[{0,1}]=t[bottom];
                    }
                    if(d.first==0&&d.second==-1){
                        m[{0,1}]=bottom;
                        m[{0,-1}]=t[bottom];
                    }
                    if(d.first==1&&d.second==0)//往上
                    {
                        m[{-1,0}]=bottom;
                        m[{1,0}]=t[bottom];
                    }
                    if(d.first==-1&&d.second==0){
                        m[{1,0}]=bottom;
                        m[{-1,0}]=t[bottom];
                    }
                    Q.push({x,y}); 
                }
            }
        }
    }
}
int main(){
    int T;
    cin>>T;
    while(T--){
        init();
        int n;
        cin>>n;
        vector<vector<char>>nums(n,vector<char>(n));
        pair<int,int>start;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>nums[i][j];
                if(nums[i][j]=='S'){
                    start.first=i;
                    start.second=j;
                }
            }
        }
        process(start,nums);
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cout<<nums[i][j];
            }
            cout<<endl;
        }
    }
}
第二题:
    暴力dfs。过了0.1。
#include<bits/stdc++.h>
using namespace std;
void process(int& H1,int A1,int D1,int H2,int A2,int D2){
    int step=0;
    while(H1>0&&H2>0){
        if(step==0){
            step=1;
            H2-=max(A1-D2,1);
        }
        else{
            step=0;
            H1-=max(A2-D1,1);
        }
    }
    return;
}
void dfs(int H,int A,int D,int idx,vector<vector<int>>&nums,int& res){
    res=max(res,idx);
    if(idx==nums.size()){
        return;
    }
    process(H,A,D,nums[idx][0],nums[idx][1],nums[idx][2]);
    if(H<0){
        return;
    }
    else{
        H+=1000;
        dfs(H,A,D,idx+1,nums,res);
        H-=1000;
        A+=10;
        dfs(H,A,D,idx+1,nums,res);
        A-=10;
        D+=10;
        dfs(H,A,D,idx+1,nums,res);
        D-=10;
    }
}
int main(){
    //dfs
    int H,A,D,n;
    cin>>H>>A>>D>>n;
    vector<vector<int>>nums(n,vector<int>(3));
    for(int i=0;i<n;i++){
        for(int j=0;j<3;j++){
            cin>>nums[i][j];
        }
    }
    int res=0;//表示最大值
    process(H,A,D,nums[0][0],nums[0][1],nums[0][2]);
    if(H<0){
        cout<<res<<endl;
        return 0;
    }
    int x=H;
    H+=1000;
    dfs(H,A,D,1,nums,res);
    H-=1000;
    A+=10;
    dfs(x,A,D,1,nums,res);
    A-=10;
    D+=10;
    dfs(x,A,D,1,nums,res);
    D-=10;
    cout<<res<<endl;
    return 0;
}




#阿里笔试##阿里巴巴##笔试题目#
全部评论
楼主也是测开吗
点赞 回复 分享
发布于 2020-04-27 20:39
第二题long long可以过50%好像, 哎第一题没做出来哭了
点赞 回复 分享
发布于 2020-04-27 20:39
tql
点赞 回复 分享
发布于 2020-04-27 20:35
我第二题DFS过了20%,然后一怒之下直接全加攻击力,直接过了70%,哈哈哈哈
点赞 回复 分享
发布于 2020-04-27 20:25

相关推荐

05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客企业服务