先按照一定的規則讓等價的骰子變換到相同的形式。我的做法是:先把數字1變換到前面,再把和1相鄰的四個數字中最小的旋轉到1的左側。
另外注意輸出的處理有些麻煩。
Ps:最近剛剛開始進行C轉C++、OI轉ACM,類定義的不是太好,qsort()用得很粗糙。
以下是我代碼:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 100000;
class newtype
{
private:
void rotate_1();
void rotate_2();
public:
newtype():pos(0) {memset(num,0,sizeof(num));}
void update();
int pos,num[6];
};
void newtype::rotate_1()
{// 0-2-1-4
int t=num[0];
num[0]=num[4];
num[4]=num[1];
num[1]=num[2];
num[2]=t;
}
void newtype::rotate_2()
{// 2-3-4-5
int t=num[2];
num[2]=num[3];
num[3]=num[4];
num[4]=num[5];
num[5]=t;
}
void newtype::update()
{
int pos_one;
for(int i=0;i<6;i++)
if(num[i]==1)
{
pos_one=i;
break;
}
switch(pos_one)
{
case 0:
rotate_1();
rotate_2();
rotate_2();
rotate_2();
break;
case 1:
rotate_1();
rotate_2();
break;
case 2:
rotate_2();
rotate_2();
rotate_2();
break;
case 3:
break;
case 4:
rotate_2();
break;
case 5:
rotate_2();
rotate_2();
}
int num_min=num[0];
if(num_min>num[1]) num_min=num[1];
if(num_min>num[2]) num_min=num[2];
if(num_min>num[4]) num_min=num[4];
while(num[0]!=num_min)
rotate_1();
}
bool equal(newtype &a,newtype &b)
{
for(int i=0;i<6;i++)
if(a.num[i]!=b.num[i])
return false;
return true;
}
int cmp(const void *a,const void *b)
{
for(int i=0;i<6;i++)
if(((newtype*)a)->num[i]!=((newtype*)b)->num[i])
return (((newtype*)a)->num[i]-((newtype*)b)->num[i]);
return ((newtype*)a)->pos-((newtype*)b)->pos;
}
int n,cnt,list[8000];
newtype r[maxn];
int cmp2(const void *a,const void *b)
{
int va=*((int*)a),vb=*((int*)b);
return r[va].pos-r[vb].pos;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=0;j<6;j++)
cin>>r[i].num[j];
r[i].pos=i;
r[i].update();
}
qsort(r+1,n,sizeof(newtype),cmp);
cnt=1;
list[cnt]=1;
newtype t=r[1];
for(int i=2;i<=n;i++)
{
while(i<=n && equal(r[i],t))
i++;
if(i<=n)
{
cnt++;
list[cnt]=i;
t=r[i];
}
}
qsort(list+1,cnt,sizeof(int),cmp2);
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)
{
int j=list[i];
bool first=true;
while(equal(r[list[i]],r[j]))
{
if(first) first=false;
else cout<<" ";
cout<<r[j].pos;
j++;
}
cout<<endl;
}
return 0;
}
posted on 2011-02-21 14:41
lee1r 閱讀(197)
評論(0) 編輯 收藏 引用 所屬分類:
題目分類:基礎/模擬