当前位置:首页 » 课程大全 » 魔方矩阵课程设计总结

魔方矩阵课程设计总结

发布时间: 2021-03-02 11:32:45

⑴ 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();
}

热点内容
武汉大学学生会辅导员寄语 发布:2021-03-16 21:44:16 浏览:612
七年级学生作文辅导学案 发布:2021-03-16 21:42:09 浏览:1
不屑弟高考成绩 发布:2021-03-16 21:40:59 浏览:754
大学毕业证会有成绩单 发布:2021-03-16 21:40:07 浏览:756
2017信阳学院辅导员招聘名单 发布:2021-03-16 21:40:02 浏览:800
查询重庆2018中考成绩查询 发布:2021-03-16 21:39:58 浏览:21
结业考试成绩怎么查询 发布:2021-03-16 21:28:40 浏览:679
14中医医师资格笔试考试成绩查分 发布:2021-03-16 21:28:39 浏览:655
名著赏析课程标准 发布:2021-03-16 21:27:57 浏览:881
北京大学商业领袖高端培训课程 发布:2021-03-16 21:27:41 浏览:919