2011年12月29日木曜日

直方体の重なり

ソニーの2013年の入社試験のプログラムコンテンストの練習問題をといてみました。
http://www.sony.co.jp/SonyInfo/Jobs/newgrads/sus/go_for_it.html
 重なる条件より、重ならない条件を考えたほうが楽なので、まず一次元で重ならない判定関数を作って試験をして、それを三次元に拡張しています。また、始点と終点を含めるか含めないかでテストケースも異なるのですが、とりあえずは始点は含める、終点は含めないでパターンで作成しています。

---------

#include <stdio.h>

class Cube{
    public:

    Cube(int xx,int yy,int zz,int ww,int hh,int dd);
    virtual ~Cube();

    static bool kasanaranai(int x0,int w0,int x1,int w1);
    bool kasanaru1d(Cube& cc);
    bool kasanaru(Cube& cc);

    private:
    int x,y,z,w,h,d;
};

Cube::Cube(int xx,int yy,int zz,int ww,int hh,int dd){
    x=xx;y=yy;z=zz;
    w=ww;h=hh;d=dd;
}


Cube::~Cube(){
}


bool Cube::kasanaranai(int x0,int w0,int x1,int w1){
    //printf("kita %d %d %d %x\n",x0,w0,x1,w1);
    if(x0+w0<=x1 || x1+w1<=x0)return true;
    return false;
}

bool Cube::kasanaru1d(Cube& cc){
    return !kasanaranai(x,w,cc.x,cc.w);
}

bool Cube::kasanaru(Cube& cc){
    return (!kasanaranai(x,w,cc.x,cc.w)) && (!kasanaranai(y,h,cc.y,cc.h)) && (!kasanaranai(z,d,cc.z,cc.d));
}


main(){
    Cube c0(0,0,0,2,2,2);
    Cube c1(2,2,2,2,2,2);
    Cube c2(-2,-2,-2,2,2,2);
    Cube c3(-2,-2,-2,3,3,3);
    Cube c4(-2,-2,-2,20,20,20);
    Cube c5(-2,-2,-2,20,20,2);
    Cube c6(-2,-2,-2,20,20,3);
    Cube c7(-2,-2,-2,2,20,20);
    Cube c8(-2,-2,-2,3,20,20);
    Cube c9(-2,-2,-2,20,2,20);
    Cube ca(-2,-2,-2,20,3,20);
    printf("t1\n");
    printf("%s\n",c0.kasanaru1d(c1)?"kasanaRU!!":"kasanaraNAI");
    printf("t2\n");
    printf("%s\n",c0.kasanaru1d(c2)?"kasanaRU!!":"kasanaraNAI");
    printf("t3\n");
    printf("%s\n",c0.kasanaru1d(c3)?"kasanaRU!!":"kasanaraNAI");
    printf("t4\n");
    printf("%s\n",c0.kasanaru1d(c4)?"kasanaRU!!":"kasanaraNAI");

    printf("t5\n");
    printf("%s\n",c0.kasanaru(c1)?"kasanaRU!!":"kasanaraNAI");
    printf("t6\n");
    printf("%s\n",c0.kasanaru(c2)?"kasanaRU!!":"kasanaraNAI");
    printf("t7\n");
    printf("%s\n",c0.kasanaru(c3)?"kasanaRU!!":"kasanaraNAI");
    printf("t8\n");
    printf("%s\n",c0.kasanaru(c4)?"kasanaRU!!":"kasanaraNAI");
    printf("t9\n");
    printf("%s\n",c0.kasanaru(c5)?"kasanaRU!!":"kasanaraNAI");
    printf("ta\n");
    printf("%s\n",c0.kasanaru(c6)?"kasanaRU!!":"kasanaraNAI");
    printf("tb\n");
    printf("%s\n",c0.kasanaru(c7)?"kasanaRU!!":"kasanaraNAI");
    printf("tc\n");
    printf("%s\n",c0.kasanaru(c8)?"kasanaRU!!":"kasanaraNAI");
    printf("td\n");
    printf("%s\n",c0.kasanaru(c9)?"kasanaRU!!":"kasanaraNAI");
    printf("te\n");
    printf("%s\n",c0.kasanaru(ca)?"kasanaRU!!":"kasanaraNAI");
}

0 件のコメント:

コメントを投稿