ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1015. Найдите различия!

#include <fstream.h>

unsigned long n;
int a[6];
// 0 LEFT   on the left side of the die,
// 1 RIGHT  then on the right side,
// 2 TOP    on the top,
// 3 FRONT  on the forward side,
// 4 BOTTOM on the bottom
// 5 BACK   and on the backward side

void permut(int x0, int x1, int x2, int x3, int x4, int x5)
{
 int b[6];
 b[0] = a[x0]; b[1] = a[x1]; b[2] = a[x2];
 b[3] = a[x3]; b[4] = a[x4]; b[5] = a[x5];
 for(int i=0; i<6; i++) a[i] = b[i];
}
long dig[200];
long sh[200];
int *w;
long *s;
int main()
{
 cin>>n;
 w = new int[n];
 s = new long[n];
 int v[6]; int sm=1, j; long i;
 for(j=1; j<6; sm*=j++) v[6-j] = sm;
 for(j=0; j<200; j++) dig[j] = 0;
 for(i=0; i<n; i++)
 {
  for(int j=0; j<6; j++) {cin>>a[j]; a[j]--;}
  if(!a[3] | !a[5]) permut(3,5,2,1,4,0);
  while(a[0]) permut(4,2,0,3,1,5);
  while(a[2] != (a[1]==1 ? 2:1) ) permut(0,1,3,4,5,2);
  int x = 0;
  for(int k=1; k<6; k++)
  {
    x += v[k]*(a[k]-1);
    for(int t=k+1; t<6; t++) if(a[t]>a[k]) a[t]--;
  }
  w[i] = x;  dig[x]++;
 }

 long q = 0;
 for(j=1; j<200; j++)
  {sh[j] = sh[j-1]+dig[j-1]; if(dig[j-1]) q++;}
 cout<<q;
 for(i=0; i<n; i++) s[sh[w[i]]++] = i;
 long k = 0;
 for(j=0; j<200; j++) if(dig[j])
 {
  cout<<'\n';
  for(i=0; i<dig[j]; i++) cout<<(1+s[k++])<<' ';
 }
 cout<<'\n';
 delete w;
 delete s;
 return 0;
}