c语言问题 给定一个二阶魔方的任意打乱状态,需要求解至少多少步复原,以及具体的复原步骤, 应该使用

Python010

c语言问题 给定一个二阶魔方的任意打乱状态,需要求解至少多少步复原,以及具体的复原步骤, 应该使用,第1张

WCA(World Cube Association 世界魔方协会)对现在的3x3x3魔方打乱标准作出了如下规范:

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...")

}