| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2394 人关注过本帖
标题:请问谁会偶数阶魔方的?
取消只看楼主 加入收藏
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
 问题点数:0 回复次数:5 
请问谁会偶数阶魔方的?
2)、当n为4的倍数时:采用对称元素交换法。首先把数n×n-1按行从上至下,奇数行从左至右,偶数行从右至左顺序填人方阵的n×n格。
然后,把方阵的所有4×4子方阵中的两对角线上位置(即(i-j) mod 4=0||(i+j-1) mod 4=0,其中i为行号,j为列号)
上的数固定下来不动;所有其它位置上的数关于方阵中心作对称交换,也就是把元素a(i,j)与元素a(n+1-i,n+1-j)的值交换。

3)、当n为非4倍数的偶数(即4m+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。上述奇数阶魔方给分解的4个子方阵对应赋值,
上左子方最小(i),下右子次小(i+v),下左子方最大(i+3v),上右子方次大(i+2v),即4个子方阵对应元素相差v,其中v=n*n/4,
然后作相应的元素交换:
  a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2)
  a(t,1)与a(t+u,1);a(t,t)与a(t+u,t)两对元素交换
  其中u=n/2,t=(n+2)/4
上述交换使每行每列与两对角线上元素之和相等。




为什么按照上面的方法做,做出了的魔方是不对的?我是做最简单的4*4魔方的,有一些列相加和不等于34(多数行列等于34的)谢谢你的解答啊。我是初学的。
搜索更多相关主题的帖子: 魔方 偶数 方阵 mod 左子 
2007-07-27 14:15
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
得分:0 
我現在知道4的倍數怎么做了
上面介紹4的倍數的方法是錯的,做出來的魔方都不對的。

2007-07-30 18:28
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
得分:0 
当n为非4倍数的偶数(即4m+2形)时怎么做啊?? 就差这种情况了 按照上面的做法 好像不行啊
这是我的程序 谢谢。
#include<iostream>
#include<iomanip>
using namespace std;
#define MAX 20

int Matrix[MAX][MAX];

void oddMatrix(int row1,int col1,int order,int cnt)
{
int row,col,count;
row=row1;
col=col1+order/2;
for(count=cnt;count<=cnt+order*order-1;count++)
{
Matrix[row][col]=count;
if(count%order==0)
row++;
else
{
row=(row==row1)?(order-1+row1):row-1;
col=col1+(col==col1+order-1)?col1:col+1;
}
}
}

void addMatrix(int row1,int col1,int order,int NUM)
{
int i,j;
for(i=0;i<order;i++)
for(j=0;j<order;j++)
Matrix[i+row1][j+col1]=Matrix[i][j]+NUM;
}



main()
{
int i,j,u,t,current;
int order=1;
int count=1;
int row1,col1;
i=0;
j=0;

cout<<"Enter a number"<<endl;
cin >>order;
if(order%4==0)
{
for(i=0;i<order;i++)
for(j=0;j<order;j++)
{
Matrix[i][j]=count;
count++;
}

for(i=0;i<order;i++)
for(j=0;j<order;j++)
{
if(i==j||i+j==order-1)
Matrix[i][j]=order*order+1-Matrix[i][j];
}
}
else if(order%2!=0)
oddMatrix(0,0,order,1);
else
{
oddMatrix(0,0,order/2,1);
addMatrix(order/2,order/2,order/2,order*order/4);
addMatrix(0,order/2,order/2,order*order/2);
addMatrix(order/2,0,order/2,order*order/4*3);
u=order/2;t=(order+2)/4;
for(i=0;i<order;i++)
for(j=0;j<order;j++)
{
if(j<t||j>order-t+2)
{
current=Matrix[i][j];
Matrix[i][j]=Matrix[i+u][j];
Matrix[i+u][j]=current;
}
}
current=Matrix[t][1];
Matrix[t][1]=Matrix[t+u][1];
Matrix[t+u][1]=current;

current=Matrix[t][t];
Matrix[t][t]=Matrix[t+u][t];
Matrix[t+u][t]=current;
}

for(row1=0;row1<order;row1++)
{
for(col1=0;col1<order;col1++)
cout<<setw(4)<<Matrix[row1][col1];
cout<<endl;
}
return 0;
}

2007-07-31 14:42
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
得分:0 
那个贴没有4m+2阶的情况

2007-08-02 08:47
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
得分:0 
枚举真的很低效率耶。
真的没有方法吗? 有是有的,但是我看到的那个表达很不清晰。所以上来询问询问大家。

2007-08-02 12:37
wingyip
Rank: 1
等 级:新手上路
威 望:2
帖 子:119
专家分:0
注 册:2007-7-16
收藏
得分:0 
3)、当n为非4倍数的偶数(即4m+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。上述奇数阶魔方给分解的4个子方阵对应赋值,
上左子方最小(i),下右子次小(i+v),下左子方最大(i+3v),上右子方次大(i+2v),即4个子方阵对应元素相差v,其中v=n*n/4,
然后作相应的元素交换:
  a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2)
  a(t,1)与a(t+u,1);a(t,t)与a(t+u,t)两对元素交换
  其中u=n/2,t=(n+2)/4

最上面就有啊。 没有给出算法的。

2007-08-02 18:17
快速回复:请问谁会偶数阶魔方的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017665 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved