1. 打乱后的状态需要至少两步才能还原。
2. 除此之外的所有状态均以等概率出现。
在此我专门评价一下第二条吧。记得在若干年前,WCA对3x3x3魔方的打乱标准是随机转动25步。这时候就有人提出质疑,为什么是25步,不是20步,不是30步,不是50步?以及由此而带来的另一个问题:25步的打乱和30步的打乱,50步的打乱到底有没有区别?
答案是:有区别的。根据软件计算,打乱25步与打乱50步相比,某些块的组合(例如1*1*2)出现的概率更高,在某种意义上会导致还原更简单,即所说的“没彻底打乱”。
#include <stdio.h>#define N 16 //N可修改
int main()
{
int a[N][N]={0},i,j,k,p,m,n
p=1
while(p==1)
{
printf("Enter n(1~%d): ",N-1)
scanf("%d",&n)
if((n!=0)&&(n<N)&&(n%2!=0))
p=0
}
i=n+1
j=n/2+1
a[1][j]=1
for(k=2k<=n*nk++)
{
i=i-1
j=j+1
if((i<1)&&(j>n))
{
i=i+2j=j-1
}
else
{
if(i<1) i=n
if(j>n) j=1
}
if(a[i][j]==0) a[i][j]=k
else
{
i=i+2
j=j-1
a[i][j]=k
}
}
for(i=1i<=ni++)
{
for(j=1j<=nj++)
printf("%4d",a[i][j])
printf("\n")
}
return 0
}
对,先要了解算法最好给你个吧,不过是有限阶的(用vc做的)
#include <stdio.h>
void main()
{
int i,j,n,k,u,t,m,x,y,a[100][100]
printf("please input n:")
scanf("%d",&n)
printf("\n")
if(n>2&&(n%2)!=0)
{
for(i=0i<ni++)
for(j=0j<nj++)
a[i][j]=0
j=(n-1)/2i=0
a[i][j]=1
for(k=2k<=n*nk++)
{i-=1j+=1
if(i<0&&j>n-1)
{i=i+2j=j-1}
else
{
if(i<0)i=n-1
if(j>n-1)j=0
}
if(a[i][j]!=0)
{ i+=2j-=1
a[i][j]=k
}
else a[i][j]=k
}
for(i=0i<ni++)
{
for(j=0j<nj++)
printf("%-4d",a[i][j])
printf("\n")
}
}
else if(n>2&&(n%4)==2)
{
for(i=0i<ni++)
for(j=0j<nj++)
a[i][j]=0
m=(n-2)/4 //n=4m+2
u=n/2//u为子矩阵行数或列数
t=(n+2)/4 //t为A的中间行
j=t-1i=0
a[i][j]=1
for(k=2k<=u*uk++)
{i-=1j+=1
if(i<0&&j>u-1)
{i=i+2j=j-1}
else
{
if(i<0)i=u-1
if(j>u-1)j=0
}
if(a[i][j]!=0)
{ i+=2j-=1
a[i][j]=k
}
else a[i][j]=k
}
j=t-1+ui=u
a[i][j]=1+u*u
for(k=u*u+2k<=2*u*uk++)
{i-=1j+=1
if(i<u&&j>u-1+u)
{i=i+2j=j-1}
else
{
if(i<u)i=u-1+u
if(j>u-1+u)j=u
}
if(a[i][j]!=0)
{ i+=2j-=1
a[i][j]=k
}
else a[i][j]=k
}
j=t-1+ui=0
a[i][j]=1+2*u*u
for(k=2*u*u+2k<=3*u*uk++)
{i-=1j+=1
if(i<0&&j>u-1+u)
{i=i+2j=j-1}
else
{
if(i<0)i=u-1
if(j>u-1+u)j=u
}
if(a[i][j]!=0)
{ i+=2j-=1
a[i][j]=k
}
else a[i][j]=k
}
j=t-1i=u
a[i][j]=1+3*u*u
for(k=3*u*u+2k<=4*u*uk++)
{i-=1j+=1
if(i<u&&j>u-1)
{i=i+2j=j-1}
else
{
if(i<u)i=u-1+u
if(j>u-1)j=0
}
if(a[i][j]!=0)
{ i+=2j-=1
a[i][j]=k
}
else a[i][j]=k
}
for(i=0i<ni++)
{
for(j=0j<nj++)
printf("%-4d",a[i][j])
printf("\n")
}
printf("\n")
for(i=0i<ui++)
for(j=0j<mj++)
if(i!=t-1)
{y=a[i][j]a[i][j]=a[i+u][j]a[i+u][j]=y}
x=t-1
for(j=0j<mj++)
{y=a[t-1][x]a[t-1][x]=a[t-1+u][x]a[t-1+u][x]=yx++}
for(j=n-1j>n-1-(m-1)j--)
for(i=0i<ui++)
{y=a[i][j]a[i][j]=a[i+u][j]a[i+u][j]=y}
for(i=0i<ni++)
{
for(j=0j<nj++)
printf("%-4d",a[i][j])
printf("\n")
}
}
else if(n>2&&n%4==0)
{
k=1
for(i=0i<ni++)
for(j=0j<nj++)
{
a[i][j]=k
k++
}
x=n-1
for(j=0j<n/2j++,x--)
{
for(i=0i<ni++)
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j]
a[i][j]=a[i][x]
a[i][x]=t
}
}
for(i=0i<ni++)
{
for(j=0j<nj++)
printf("%-4d",a[i][j])
printf("\n")
}
printf("\n")
x=n-1
for(i=0i<n/2i++,x--)
{
for(j=0j<nj++)
if(i%4!=j%4&&(i+j)%4!=3)
{
t=a[i][j]
a[i][j]=a[x][j]
a[x][j]=t
}
}
for(i=0i<ni++)
{
for(j=0j<nj++)
printf("%-4d",a[i][j])
printf("\n")
}
}
else printf("输入错误\n")
system("pause...")
}