很变态的模拟题 乱七八糟的穷举会昏头 要有条理的穷举。。
对于每一个骰子,把1转到前面,把1相邻的最小的转到左面,然后判断是否出现。转的过程自己看吧。。相当麻烦。。
#include<stdio.h>
long i,j,n,all;
long v[7];
long have[7][7][7][7][7][7];
long ans[100001][1000];
long temp,now,ll;
long top[100001];
void cha(long a,long b,long c,long d)//把这四个位置按顺序交换,模拟转的过程
{
long temp;
temp=v[a];
v[a]=v[b];
v[b]=v[c];
v[c]=v[d];
v[d]=temp;
}
long min(long a,long b,long c,long d)
{
long jl,last;
last=a;jl=1;
if (last>b)
{
last=b;jl=2;
}
if (last>c)
{
last=c;jl=3;
}
if (last>d)
{
jl=5;
}
return jl;
}
void change()
{
long minn,temp;
if (v[2]==1)
cha(2,6,1,4);
else if (v[1]==1)
cha(1,6,2,4);
else if (v[3]==1)
cha(3,6,5,4);
else if (v[5]==1)
cha(5,6,3,4);
else if (v[6]==1)
{
temp=v[4];v[4]=v[6];v[6]=temp;
temp=v[1];v[1]=v[2];v[2]=temp;
}
//上面是把1转到前面的过程
minn=min(v[1],v[2],v[3],v[5]);//找最小
if (minn==2)
{
temp=v[5];v[5]=v[3];v[3]=temp;
temp=v[1];v[1]=v[2];v[2]=temp;
}
else if (minn==3)
cha(3,2,5,1);
else if (minn==5)
cha(5,2,3,1);
//上面是把最小的转到左面的过程
}
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
for (j=1;j<=6;j++)
scanf("%d",&v[j]);
change();//转骰子到指定方向
if (have[v[1]][v[2]][v[3]][v[4]][v[5]][v[6]]!=0)
{
now=have[v[1]][v[2]][v[3]][v[4]][v[5]][v[6]];
top[now]++;
ans[now][top[now]]=i;
}
else
{
all++;
have[v[1]][v[2]][v[3]][v[4]][v[5]][v[6]]=i;
top[i]=1;
ans[i][1]=i;
ll=i;
}
}
printf("%ld\n",all);
for (i=1;i<=ll;i++)
{
if (top[i]!=0)
{
for (j=1;j<=top[i];j++)
printf("%ld ",ans[i][j]);
printf("\n");
}
}
}
posted on 2011-06-27 17:59
梦转千寻 阅读(72)
评论(0) 编辑 收藏 引用