#include #include using namespace std; #define BOTTOM 0 #define TOP 1 #define LEFT 2 #define RIGHT 3 #define FRONT 4 #define REAR 5 #define D_UP 0 #define D_DOWN 1 #define D_LEFT 2 #define D_RIGHT 3 class pos_data{ public: int pos; int direction; pos_data(int p,int d){pos=p;direction=d;} }; class dice { public: int val[6]; //int face_type_now; int x;int y; int map[5][5]; bool checked[5][5]; bool search_ended; dice(); void Init(); //int ConvertDir(int face_type_now,bool rev_lr,bool rev_ud); pos_data Move(int direction,pos_data pd); bool Search(int x,int y,pos_data pd); bool Check(); }; dice::dice(){Init();} void dice::Init(){ for(int i=0;i<6;i++)val[i]=-1; x=0;y=0; for(int i=0;i<5;i++) for(int j=0;j<5;j++) checked[i][j]=false; search_ended=false; } /* int dice::ConvertDir(int face_type_now,bool rev_lr,bool rev_ud){ switch(face_type_now){ case FRONT: if(rev_ud)return REAR; else return FRONT; case REAR: if(rev_ud)return FRONT; else return REAR; case LEFT: if(rev_lr)return RIGHT; else return LEFT; case RIGHT: if(rev_lr)return LEFT; else return RIGHT; default: return face_type_now; } } */ pos_data dice::Move(int direction,pos_data pd){ switch (direction){ case D_UP: switch (pd.pos){ case BOTTOM: switch (pd.direction){ case D_UP: return pos_data(FRONT,D_UP); case D_DOWN: return pos_data(REAR,D_UP); case D_RIGHT: return pos_data(RIGHT,D_UP); case D_LEFT: return pos_data(LEFT,D_UP); } case TOP: switch (pd.direction){ case D_UP: return pos_data(REAR,D_DOWN); case D_DOWN: return pos_data(FRONT,D_DOWN); case D_RIGHT: return pos_data(RIGHT,D_DOWN); case D_LEFT: return pos_data(LEFT,D_DOWN); } case LEFT: switch (pd.direction){ case D_UP: return pos_data(TOP,D_RIGHT); case D_DOWN: return pos_data(BOTTOM,D_RIGHT); case D_RIGHT: return pos_data(FRONT,D_RIGHT); case D_LEFT: return pos_data(REAR,D_LEFT); } case RIGHT: switch (pd.direction){ case D_UP: return pos_data(TOP,D_LEFT); case D_DOWN: return pos_data(BOTTOM,D_LEFT); case D_RIGHT: return pos_data(REAR,D_RIGHT); case D_LEFT: return pos_data(FRONT,D_LEFT); } case FRONT: switch (pd.direction){ case D_UP: return pos_data(TOP,D_UP); case D_DOWN: return pos_data(BOTTOM,D_DOWN); case D_RIGHT: return pos_data(RIGHT,D_RIGHT); case D_LEFT: return pos_data(LEFT,D_LEFT); } case REAR: switch (pd.direction){ case D_UP: return pos_data(TOP,D_DOWN); case D_DOWN: return pos_data(BOTTOM,D_UP); case D_RIGHT: return pos_data(LEFT,D_RIGHT); case D_LEFT: return pos_data(RIGHT,D_LEFT); } } case D_DOWN: switch (pd.pos){ case BOTTOM: switch (pd.direction){ case D_UP: return pos_data(REAR,D_DOWN); case D_DOWN: return pos_data(FRONT,D_DOWN); case D_RIGHT: return pos_data(LEFT,D_DOWN); case D_LEFT: return pos_data(RIGHT,D_DOWN); } case TOP: switch (pd.direction){ case D_UP: return pos_data(FRONT,D_UP); case D_DOWN: return pos_data(REAR,D_UP); case D_RIGHT: return pos_data(LEFT,D_UP); case D_LEFT: return pos_data(RIGHT,D_UP); } case LEFT: switch (pd.direction){ case D_UP: return pos_data(BOTTOM,D_LEFT); case D_DOWN: return pos_data(TOP,D_LEFT); case D_RIGHT: return pos_data(REAR,D_RIGHT); case D_LEFT: return pos_data(FRONT,D_LEFT); } case RIGHT: switch (pd.direction){ case D_UP: return pos_data(BOTTOM,D_RIGHT); case D_DOWN: return pos_data(TOP,D_RIGHT); case D_RIGHT: return pos_data(FRONT,D_RIGHT); case D_LEFT: return pos_data(REAR,D_LEFT); } case FRONT: switch (pd.direction){ case D_UP: return pos_data(BOTTOM,D_UP); case D_DOWN: return pos_data(TOP,D_DOWN); case D_RIGHT: return pos_data(LEFT,D_RIGHT); case D_LEFT: return pos_data(RIGHT,D_LEFT); } case REAR: switch (pd.direction){ case D_UP: return pos_data(BOTTOM,D_DOWN); case D_DOWN: return pos_data(TOP,D_UP); case D_RIGHT: return pos_data(RIGHT,D_RIGHT); case D_LEFT: return pos_data(LEFT,D_LEFT); } } case D_LEFT: switch (pd.pos){ case BOTTOM: switch (pd.direction){ case D_UP: return pos_data(LEFT,D_RIGHT); case D_DOWN: return pos_data(RIGHT,D_RIGHT); case D_RIGHT: return pos_data(FRONT,D_RIGHT); case D_LEFT: return pos_data(REAR,D_RIGHT); } case TOP: switch (pd.direction){ case D_UP: return pos_data(LEFT,D_LEFT); case D_DOWN: return pos_data(RIGHT,D_LEFT); case D_RIGHT: return pos_data(REAR,D_LEFT); case D_LEFT: return pos_data(FRONT,D_LEFT); } case LEFT: switch (pd.direction){ case D_UP: return pos_data(REAR,D_UP); case D_DOWN: return pos_data(FRONT,D_DOWN); case D_RIGHT: return pos_data(TOP,D_DOWN); case D_LEFT: return pos_data(BOTTOM,D_DOWN); } case RIGHT: switch (pd.direction){ case D_UP: return pos_data(FRONT,D_UP); case D_DOWN: return pos_data(REAR,D_DOWN); case D_RIGHT: return pos_data(TOP,D_UP); case D_LEFT: return pos_data(BOTTOM,D_UP); } case FRONT: switch (pd.direction){ case D_UP: return pos_data(LEFT,D_UP); case D_DOWN: return pos_data(RIGHT,D_DOWN); case D_RIGHT: return pos_data(TOP,D_RIGHT); case D_LEFT: return pos_data(BOTTOM,D_LEFT); } case REAR: switch (pd.direction){ case D_UP: return pos_data(RIGHT,D_UP); case D_DOWN: return pos_data(LEFT,D_DOWN); case D_RIGHT: return pos_data(TOP,D_LEFT); case D_LEFT: return pos_data(BOTTOM,D_RIGHT); } } case RIGHT: switch (pd.pos){ case BOTTOM: switch (pd.direction){ case D_UP: return pos_data(RIGHT,D_LEFT); case D_DOWN: return pos_data(LEFT,D_LEFT); case D_RIGHT: return pos_data(REAR,D_LEFT); case D_LEFT: return pos_data(FRONT,D_LEFT); } case TOP: switch (pd.direction){ case D_UP: return pos_data(RIGHT,D_RIGHT); case D_DOWN: return pos_data(LEFT,D_RIGHT); case D_RIGHT: return pos_data(FRONT,D_RIGHT); case D_LEFT: return pos_data(REAR,D_RIGHT); } case LEFT: switch (pd.direction){ case D_UP: return pos_data(FRONT,D_UP); case D_DOWN: return pos_data(REAR,D_DOWN); case D_RIGHT: return pos_data(BOTTOM,D_UP); case D_LEFT: return pos_data(TOP,D_UP); } case RIGHT: switch (pd.direction){ case D_UP: return pos_data(REAR,D_UP); case D_DOWN: return pos_data(FRONT,D_DOWN); case D_RIGHT: return pos_data(BOTTOM,D_DOWN); case D_LEFT: return pos_data(TOP,D_DOWN); } case FRONT: switch (pd.direction){ case D_UP: return pos_data(RIGHT,D_UP); case D_DOWN: return pos_data(LEFT,D_DOWN); case D_RIGHT: return pos_data(BOTTOM,D_RIGHT); case D_LEFT: return pos_data(TOP,D_LEFT); } case REAR: switch (pd.direction){ case D_UP: return pos_data(LEFT,D_UP); case D_DOWN: return pos_data(RIGHT,D_DOWN); case D_RIGHT: return pos_data(BOTTOM,D_LEFT); case D_LEFT: return pos_data(TOP,D_RIGHT); } } } } bool dice::Search(int x,int y,pos_data pd){ if (map[x][y]==0)return true; if ((x<0)||(5<=x))return true; if ((y<0)||(5<=y))return true; if (checked[x][y])return true; if (val[pd.pos]!=-1)return false; if (search_ended)return false; val[pd.pos]=map[x][y]; checked[x][y]=true; /* printf("searching:(%d,%d)-%d[%d]...",x,y,pd.pos,pd.direction); for (int i=0;i<6;i++) printf("%d,",val[i]); printf("\n"); */ return Search(x-1,y,Move(D_LEFT,pd)) &&Search(x,y-1,Move(D_UP,pd)) &&Search(x+1,y,Move(D_RIGHT,pd)) &&Search(x,y+1,Move(D_DOWN,pd)); } bool dice::Check(){ if(val[BOTTOM]+val[TOP]!=7)return false; if(val[LEFT]+val[RIGHT]!=7)return false; if(val[FRONT]+val[REAR]!=7)return false; for (int i=0;i<6;i++){ for (int j=i+1;j<6;j++){ if(val[i]==val[j])return false; } } return true; } int main (){ int data_num; bool ended; dice dice_data; cin>>data_num; for(int count=0;count>dice_data.map[j][i]; } } for (int x=0;x<5;x++){ for(int y=0;y<5;y++){ if(dice_data.map[x][y]!=0){ if(!dice_data.Search(x,y,pos_data(BOTTOM,D_UP))){ printf("false\n"); ended=true;break; } dice_data.search_ended=true; } } if(ended)break; } if(!ended){ bool result=dice_data.Check(); if(result)printf("true\n"); else printf("false\n"); } } }