魔方矩阵课程设计总结
⑴ C++魔方矩阵问题
增加源一个Int变量K,并令它的初始值为0;
将if 语句改为:
for(int i=1;i<12;i++)
{if(sum[i]==sum[0])
k++;}
if(k==11)//12个sum都相等
cout<<"该矩阵是魔方矩阵"<<endl;
else cout<<"该矩阵不是魔方矩阵"<<endl;
这样就可以了。
⑵ matlab 魔方矩阵的程序设计
^function M = magic(n)
%MAGIC Magic square.
% MAGIC(N) is an N-by-N matrix constructed from the integers
% 1 through N^ with equal row, column, and diagonal sums.
% Proces valid magic squares for all N > 0 except N = 2.
% Copyright 1984-2002 The MathWorks, Inc.
% $Revision: 5.15 $ $Date: 2002/04/15 03:44:23 $
% Historically, MATLAB's magic was a built-in function.
% This M-file uses a new algorithm to generate the same matrices.
n = floor(real(double(n(1))));
% Odd order.
if mod(n,2) == 1
[J,I] = meshgrid(1:n);
A = mod(I+J-(n+3)/2,n);
B = mod(I+2*J-2,n);
M = n*A + B + 1;
% Doubly even order.
elseif mod(n,4) == 0
[J,I] = meshgrid(1:n);
K = fix(mod(I,4)/2) == fix(mod(J,4)/2);
M = reshape(1:n*n,n,n)';
M(K) = n*n+1 - M(K);
% Singly even order.
else
p = n/2;
M = magic(p);
M = [M M+2*p^2; M+3*p^2 M+p^2];
if n == 2, return, end
i = (1:p)';
k = (n-2)/4;
j = [1:k (n-k+2):n];
M([i; i+p],j) = M([i+p; i],j);
i = k+1;
j = [1 i];
M([i; i+p],j) = M([i+p; i],j);
end
⑶ 魔方矩阵的介绍
魔方矩阵是有相同的行数和列数,并在每行每列、对角线上的和都相等。你能构造任何大小(除了2x2)的魔方矩阵。
⑷ 什么是魔方矩阵
魔术矩阵是由一个n×n(n为奇数)的整数矩阵构成,矩阵中的整数值是从1~n^2[n的平方]。每一行,每一列和两个对角线上数值之和是一样的。
下面我以n=5的魔术矩阵为例,给出详细的说明
15
8
1
24
17
16
14
7
5
23
22
20
13
6
4
3
21
19
12
10
9
2
25
18
11
这个n为5的魔术矩阵,他的每一行,每一列,两个对角线的和均为65
算法设计:
先在矩阵第一行中间的位置上放1,然后把数字按照升序沿着左上角放置到矩阵中。如果越界了,就假设周围还有一个矩阵,将数字放到那个位置上;如果那个位置已经被占据了,就跳过该位置放到下面的位置,然后重新按照原来的方法放。如图:在5×5的魔术矩阵中,放完1以后,就把2放到1的左上角,但是此时已经越界了。假设,在原来的矩阵上面还有一个矩阵,则数字2所放的位置应该是在最后一行的第二个位置,接下去就要把数字3放到2的左上角,依次放下去,当放到6的时候,由于1已经将下一个位置占了,所以就放到5下面的位置。依照这样的规律直到把数字都放完。
程序设计:
#include
#define Max_Size 15
void main()
{
static int square[Max_Size][Max_Size];
int i,j,row,column,count,size;
printf("输入的矩阵大小:\n");
scanf("%d",&size);
if(size<1||size>Max_Size+1)
{
printf("输入的矩阵太大!");
//exit(1);
}
if(!(size % 2))
{
printf("大小不能为偶数");
//exit(1);
}
for(i=0;i for(j=0;j square[i][j] = 0;
square[0][(size-1)/2] = 1;
i = 0;
j = (size-1)/2;
for(count=2;count<=size*size;count++)
{
row = (i-1<0)?(size-1):(i-1);
column=(j-1<0)?(size-1):(j-1);
if(square[row][column])
i=(++i)%size;
else
{
i = row;
j = (j-1<0)?(size-1):--j;
}
square[i][j] = count;
}
printf("大小为%d的魔术矩阵为:\n",size);
for(i=0;i {
for(j=0;j {
printf("%4d",square[i][j]);
}
printf("\n");
}
}
程序输出:
输入的矩阵大小:
5
大小为5的魔术矩阵为:
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
⑸ 1至10次的魔方矩阵
对平面魔方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)
⑴
N
为奇数时,最简单
(1)
将1放在第一行中间一列;
(2)
从2开始直到n×n止各数依次按下列规则存放:
按
45°方向行走,如向右上
每一个数存放的行比前一个数的行数减1,列数加1
(3)
如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1;
(4)
如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
⑵
N为4的倍数时
采用对称元素交换法。
首先把数1到n×n按从上至下,从左到右顺序填入矩阵
然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对
称交换,即a(i,j)与a(n+1-i,n+1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)
⑶
N
为其它偶数时
当n为非4倍数的偶数(即4n+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,0)与a(t+u-1,0);a(t-1,t-1)与a(t+u-1,t-1)两对元素交换
其中u=n/2,t=(n+2)/4
上述交换使每行每列与两对角线上元素之和相等。
⑹ 关于matlab 魔方矩阵的
A = magic(10);
A(1,:)表示第一行,回A(2,:)表示答第二行,...,依次类推
A(:,1)表示第一列,A(:,2)表示第二列,...,依次类推
diag(A)表示主对角线的元素
diag(fliplr(A))表示副对角线的元素
sum函数用来求和,比如
sum(A(1,:)) 返回的就是矩阵第一行元素之和,依次类推
至于最后一问:
[rows,cols,vals] = find( 40<A & A<60 );
for i=1:length(rows)
A(rows(i),cols(i))=NaN;
end;
⑺ 魔方矩阵的算法设计
先在矩阵第一行中间的位置上放1,然后把数字按照升序沿着左上角放置到矩阵中。内如果越界了,容就假设周围还有一个矩阵,将数字放到那个位置上;如果那个位置已经被占据了,就跳过该位置放到下面的位置,然后重新按照原来的方法放。如图:在5×5的魔术矩阵中,放完1以后,就把2放到1的左上角,但是此时已经越界了。假设,在原来的矩阵上面还有一个矩阵,则数字2所放的位置应该是在最后一行的第二个位置,接下去就要把数字3放到2的左上角,依次放下去,当放到6的时候,由于1已经将下一个位置占了,所以就放到5下面的位置。依照这样的规律直到把数字都放完。
⑻ 魔方矩阵的魔方函数
Matlab中自动生成魔方矩阵的函数:
magic(n) n是矩阵维数,例如在MATLAB命令窗口输入
magic(5) ,将随机产生5阶魔方阵。
⑼ matlab中的魔方矩阵(简单问题)
1魔方矩阵是方阵
2.计算魔方矩阵某一行的和:sum(A(a,:))
计算魔方矩阵某一列的和:sum(A(:,a))
计算魔方矩阵对角线的和:sum(diag(A))
⑽ 求助C语言高手,关于魔方矩阵的问题
#include <stdio.h>
#include <conio.h>
#define N 15
void main()
{
int iArr[N][N] = {0}; /*魔法阵数组*/
/*定义变量,i,j为循环控制变,iNum表示数组的行数列数,iPox、iPoy分别代表数组的行数、列数,iPosx、iPosy分别代表保存数组行数变量,保存数组列数变量*/
int i = 0, j = 0, iNum = 0, iPosx = 0, iPosy = 0, iPox = 0, iPoy = 0;
printf("input the number:\n"); /*输入数组的行数列数*/
scanf("%d",&iNum);
if (iNum % 2 == 0 || iNum > 15 || iNum <= 0) /*判断iNum是否为奇数*/
{
printf("ERROR!"); /*偶数,输出错误提示*/
}
else
{ /*为奇数,进行处理*/
iPox = 0;
iPoy = iNum / 2; /*算出1所在的位置*/
for (i=1; i<=iNum*iNum; i++)
{
iArr[iPox][iPoy] = i;
iPosx = iPox;
iPosy = iPoy;
if (iPox == 0) /*如果上一个数的行数为第一行,则下一个数的行数为最下一行,列数同样加1;*/
{
if (iPoy != iNum-1) /*上一个数是第一行最后一列时,则把下一个数放在上一个数的下面*/
{
iPox = iNum-1;
}
else
{ /*每一个数存放的行比前一个数的行数减1,列数加1(右上方)*/
iPox++;
iPoy--;
}
}
else
{
iPox--;
}
if (iPoy == iNum-1) /*当上一个数的列数为最后一列时,下一个数的列数应为第一列,行数减去1;*/
{
iPoy = 0;
}
else
{
iPoy++;
}
if (iArr[iPox][iPoy] != 0) /*如果按上面规则确定的位置上已有数时,则把下一个数放在上一个数的下面*/
{
iPox = iPosx+1;
iPoy = iPosy;
}
}
printf("The array is :\n");
for (i=0; i<iNum; i++) /*输出该数组*/
{
for (j=0; j<iNum; j++)
{
printf("%3d",iArr[i][j]);
}
printf("\n");
}
}
getch();
}