#pragma GCC target("avx2") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include #include using namespace std; long long start_time; void start_clock(){ struct timeval tv; gettimeofday(&tv, NULL); start_time=(tv.tv_sec*1000000+tv.tv_usec); } long long current_clock(){ struct timeval tv; gettimeofday(&tv, NULL); long long current_time=(tv.tv_sec*1000000+tv.tv_usec); // cout << current_time-start_time << "(us)\n"; return current_time-start_time; } long long get_rand(long long lim,mt19937_64 &eg){ return (long long)(eg()%lim); } int f(vector> &dice){ int res=0; for(int i=0;i<6;i++){ vector mind(6,1e9); vector sumd(6,0); for(int j=0;j<6;j++){ int tg=i*6+j; vector bk(6,0); for(int k=0;k<6;k++){ bk[dice[tg][k]]++; } for(int k=0;k<6;k++){ mind[k]=min(mind[k],bk[k]); sumd[k]+=bk[k]; } } for(int j=0;j<6;j++){ if(mind[j]>0){ res+=(sumd[j]-3); } } } for(int i=0;i<6;i++){ vector mind(6,1e9); vector sumd(6,0); for(int j=0;j<6;j++){ int tg=j*6+i; vector bk(6,0); for(int k=0;k<6;k++){ bk[dice[tg][k]]++; } for(int k=0;k<6;k++){ mind[k]=min(mind[k],bk[k]); sumd[k]+=bk[k]; } } for(int j=0;j<6;j++){ if(mind[j]>0){ res+=(sumd[j]-3); } } } return res; } void output(vector> &dice){ vector rx(36),ry(36); for(int i=0;i<6;i++){ for(int j=0;j<6;j++){ rx[dice[i*6+j][6]]=i+1; ry[dice[i*6+j][6]]=j+1; } } for(int i=0;i<36;i++){ cout << rx[i] << " " << ry[i] << "\n"; } } int main(){ std::random_device seed_gen; std::mt19937_64 engine(seed_gen()); start_clock(); vector> dice(36); for(int i=0;i<36;i++){ dice[i].resize(7); dice[i][6]=i; for(int j=0;j<6;j++){ cin >> dice[i][j]; dice[i][j]--; } } int val=f(dice); while(1){ int i=get_rand(12,engine); vector p,q; if(i%2){ int knd=(i%12)/2; for(int j=0;j<6;j++){ p.push_back(knd*6+j); } } else{ int knd=(i%12)/2; for(int j=0;j<6;j++){ p.push_back(j*6+knd); } } q=p; shuffle(q.begin(),q.end(),engine); int nval=-1; vector> nd; do{ vector> cd=dice; for(int j=0;j<6;j++){ cd[p[j]]=dice[q[j]]; } int cf=f(cd); if(nval1950000){break;} } output(dice); cerr << f(dice) << "\n"; return 0; }