posts - 0,comments - 0,trackbacks - 0
很变态的模拟题 乱七八糟的穷举会昏头 要有条理的穷举。。
对于每一个骰子,把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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理