问题阐述
给定两个整数M、N,生成一个M*N的矩阵,矩阵中元素取值为A-Z的26个字母中的一个,A在左上角,其余各字母按顺时针方向旋转前进,依次递增放置,当超过Z时,又从A开始填充。例如,当M=5,N=8时。矩阵中的内容如下:
A B C D E F G H
V W X Y Z A B I
U J K L M N C J
T I H G F E D K
S R Q P O N M L
解题思路
1、让写字的位置按照顺时针方向前进,这样字母只要依次填入就好了;
2、建立字母表,用数组代表每一个字母;
3、定义当前移动的位置从(1,1)开始,定义前进方向;
4、定义行和列的起止位置;
当列数增加的方向走到头(列的终止位置),行的起始位置+1(因为回不到现在所在的这一行了);方向转变到行数增加方向;
当行数增加的方向走到头(行的终止位置),列的终止位置-1(因为回不到现在所在的这一列了);方向转变到列数减小方向;
当列数减小的方向走到头(列的起始位置),行的终止位置-1;方向转变到行数减小方向;
当行数减小的方向走到头(行的起始位置),列的起始位置+1;方向转变到列数增加方向;
5、对第4步进行循环,共循环M*N次;
matlab代码
clear
clc
m = input("请输入矩阵行数:");
n = input("请输入矩阵列数:");
num = zeros(m,n);
ab = ['A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N'...
'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z'];
i = 1; %矩阵位置行,j列
j = 1;
k = 1; %ab表位置
e = 0; %初始方向
c = 1; %loop
cont = 0;
sm = 1; %行起始位置
sn = 1; %列起始位置
em = m; %行终止位置
en = n; %列终止位置
while c
switch e
case 0 %列增大方向
num(i,j) = ab(k);
j = j+1;
if j==en
e = 1;
sm = sm+1;
end
case 1 %行增大
num(i,j) = ab(k);
i = i+1;
if i==em
e = 2;
en = en-1;
end
case 2 %列减小
num(i,j) = ab(k);
j = j-1;
if j==sn
e = 3;
em = em-1;
end
case 3 %行减小
num(i,j) = ab(k);
i = i-1;
if i==sm
e = 0;
sn = sn+1;
end
otherwise
warning("有问题?");
end
cont = cont+1;
k = k+1;
if k==27
k = 1;
end
if cont==m*n
c = 0;
end
end
char(num) %字符矩阵输出
运行结果(7*12为例)
请输入矩阵行数:7
请输入矩阵列数:12
>> char(num)
ans =
7×12 char 数组
'ABCDEFGHIJKL'
'HIJKLMNOPQRM'
'GHIJKLMNOPSN'
'FGZABCDEFQTO'
'EFYXWVUTSRUP'
'DEDCBAZYXWVQ'
'CBAZYXWVUTSR'
其他
我这是头一次使用CSDN发文章,室友给了我这道题,做出来感觉还不错就想记录一下。如果有什么问题,欢迎大家留言~