依图科技的笔试题--蚂蚁爬魔方

无力吐槽今天依图科技的第一题,蚂蚁爬魔方,这题确定是能在短时间里写完的吗?  第二题10分钟秒过了,第一题写了1个小时,没debug完,过了22%, 赛后debug的代码,长得像坨屎,不知道有没有短点的代码。
参考:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;

int pos[6][9][4],p[5][5];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int encode(int x, int y){
    return x*10+y;
}
pair<int,int> decode(int en){
    return make_pair(en/10,en%10);
}

void get(){
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            for(int k=0;k<4;k++){
                int fs=decode(p[i][j]).first;
                int se=decode(p[i][j]).second;
                pos[fs][se][k]=p[i+dx[k]][j+dy[k]];
            }
}


int get0(){
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            p[i][j]=encode(0,(i-1)*3+j-1);
    //up
    p[0][1]=encode(4,6);
    p[0][2]=encode(4,7);
    p[0][3]=encode(4,8);

    //down
    p[4][1]=encode(5,0);
    p[4][2]=encode(5,1);
    p[4][3]=encode(5,2);

    //left
    p[1][0]=encode(3,2);
    p[2][0]=encode(3,5);
    p[3][0]=encode(3,8);

    //right
    p[1][4]=encode(1,0);
    p[2][4]=encode(1,3);
    p[3][4]=encode(1,6);

    get();
}

int get1(){
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            p[i][j]=encode(1,(i-1)*3+j-1);
    //up
    p[0][1]=encode(4,8);
    p[0][2]=encode(4,5);
    p[0][3]=encode(4,2);

    //down
    p[4][1]=encode(5,2);
    p[4][2]=encode(5,5);
    p[4][3]=encode(5,8);

    //left
    p[1][0]=encode(0,2);
    p[2][0]=encode(0,5);
    p[3][0]=encode(0,8);

    //right
    p[1][4]=encode(2,0);
    p[2][4]=encode(2,3);
    p[3][4]=encode(2,6);

    get();
}

int get2(){
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            p[i][j]=encode(2,(i-1)*3+j-1);
    //up
    p[0][1]=encode(4,2);
    p[0][2]=encode(4,1);
    p[0][3]=encode(4,0);

    //down
    p[4][1]=encode(5,8);
    p[4][2]=encode(5,7);
    p[4][3]=encode(5,6);

    //left
    p[1][0]=encode(1,2);
    p[2][0]=encode(1,5);
    p[3][0]=encode(1,8);

    //right
    p[1][4]=encode(3,0);
    p[2][4]=encode(3,3);
    p[3][4]=encode(3,6);

    get();
}

int get3(){
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            p[i][j]=encode(3,(i-1)*3+j-1);
    //up
    p[0][1]=encode(4,0);
    p[0][2]=encode(4,3);
    p[0][3]=encode(4,6);

    //down
    p[4][1]=encode(5,6);
    p[4][2]=encode(5,3);
    p[4][3]=encode(5,0);

    //left
    p[1][0]=encode(2,2);
    p[2][0]=encode(2,5);
    p[3][0]=encode(2,8);

    //right
    p[1][4]=encode(0,0);
    p[2][4]=encode(0,3);
    p[3][4]=encode(0,6);

    get();
}

int get4(){
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            p[i][j]=encode(4,(i-1)*3+j-1);
    //up
    p[0][1]=encode(2,2);
    p[0][2]=encode(2,1);
    p[0][3]=encode(2,0);

    //down
    p[4][1]=encode(0,0);
    p[4][2]=encode(0,1);
    p[4][3]=encode(0,2);

    //left
    p[1][0]=encode(3,0);
    p[2][0]=encode(3,1);
    p[3][0]=encode(3,2);

    //right
    p[1][4]=encode(1,2);
    p[2][4]=encode(1,1);
    p[3][4]=encode(1,0);

    get();
}


int get5(){
    for(int i=1;i<=3;i++)
        for(int j=1;j<=3;j++)
            p[i][j]=encode(5,(i-1)*3+j-1);
    //up
    p[0][1]=encode(0,6);
    p[0][2]=encode(0,7);
    p[0][3]=encode(0,8);

    //down
    p[4][1]=encode(2,8);
    p[4][2]=encode(2,7);
    p[4][3]=encode(2,6);

    //left
    p[1][0]=encode(3,8);
    p[2][0]=encode(3,7);
    p[3][0]=encode(3,6);

    //right
    p[1][4]=encode(1,6);
    p[2][4]=encode(1,7);
    p[3][4]=encode(1,8);

    get();
}

int left(int x,int y,int ax,int ay){
    int id;
    for(int i=0;i<4;i++)
        if(pos[x][y][i]==encode(ax,ay)) id=i;
    id--;
    if(id<0) id+=4;
    return id;
}

int right(int x,int y,int ax,int ay){
    int id;
    for(int i=0;i<4;i++)
        if(pos[x][y][i]==encode(ax,ay)) id=i;
    id++;
    if(id==4) id-=4;
    return id;
}

int opposite(int x,int y,int ax,int ay){
    int id;
    for(int i=0;i<4;i++)
        if(pos[ax][ay][i]==encode(x,y)) id=i;
    return (id+2)%4;
}
int main()
{
    string a[6],s;
    for(int i=0;i<6;i++) cin>>a[i];
    cin>>s;
    get0();
    get1();
    get2();
    get3();
    get4();
    get5();
    int x=0,y=4,ax=0,ay=5;
    for(int i=0;i<s.size();i++){
        if(s[i]=='L'){
            int id=left(x,y,ax,ay);
            ax=decode(pos[x][y][id]).first;
            ay=decode(pos[x][y][id]).second;
        }
        else if(s[i]=='R'){
            int id=right(x,y,ax,ay);
            ax=decode(pos[x][y][id]).first;
            ay=decode(pos[x][y][id]).second;

        }
        else{
            int id=opposite(x,y,ax,ay);
            x=ax,y=ay;
            ax=decode(pos[x][y][id]).first;
            ay=decode(pos[x][y][id]).second;
        }
        printf("%c",a[x][y]);
    }
    puts("");
    return 0;
}

/*
input:
abcdefghi
ooooooooo
ppppppppp
qqqqqqqqq
rrrrrrrrr
sssssssss
LMMMMMMMMMMMMRRRMMMMMMMMMMMM

output:
ebrrrpppsssheeeedqqqpppooofe
*/

#笔试题目##依图科技#
全部评论
第一题搞半天才十几,幸亏去做第二题了,最后也没时间做附加题。。
点赞
送花
回复
分享
发布于 2018-09-20 20:32
没做过第二题这种题的,表示一时半会想不出来。
点赞
送花
回复
分享
发布于 2018-09-21 01:28
滴滴
校招火热招聘中
官网直投

相关推荐

点赞 评论 收藏
转发
点赞 7 评论
分享
牛客网
牛客企业服务