作业帮 > 综合 > 作业

求助利用Matlab编程:矩阵中每行各取一个元素,使其和最小,并给出该最短路径的坐标

来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/08/13 11:06:15
求助利用Matlab编程:矩阵中每行各取一个元素,使其和最小,并给出该最短路径的坐标
求助利用Matlab编程:矩阵中每行各取一个元素,使其和最小,并给出该最短路径的坐标
分析:矩阵中每行各取一个元素,使其和最小,那么如果每行都取的是该行的最小值的话,那么最后的和肯定也是最小的.
所以只需找到每行的最小值即可.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>> a=magic(10)
a =
92 99 1 8 15 67 74 51 58 40
98 80 7 14 16 73 55 57 64 41
4 81 88 20 22 54 56 63 70 47
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
23 5 82 89 91 48 30 32 39 66
79 6 13 95 97 29 31 38 45 72
10 12 94 96 78 35 37 44 46 53
11 18 100 77 84 36 43 50 27 59
>> [m,n]=min(a')%%min函数是按列搜索最小值,所以对a进行转置后搜索就是按行搜索
m =
1 7 4 3 2 17 5 6 10 11%%m是每行的最小值
n =
3 3 1 5 4 1 2 2 1 1%%n是最小值对应的列,最小值对应的行其实就是数组n的元素索引值.
即最小值对应的坐标为:(1,n(1)) (2,n(2)) (3,n(3)) (4,n(4)).
再问: 不好意思,我没写清楚,其实还有一个条件,就是相邻两行的元素位置最多只能差1,比如元素a[i][j]的下一个元素只能是a[i+1][j-1]a[i+1][j]a[i+1][j+1]之一。
再答: 思路(仅供参考):相邻两行的元素位置之差最多为1,那么先找到第一行的最小值,假设其坐标为1,j,那么在第二行取a(2,j-1) a(2,j) a(2,j+1)比较它们的大小,取最小值,然后让j等于最小值的j;接着在第三行取a(3,j-1) a(3,j) a(3,j+1),j为第二行最小值的列,再次比较它们的大小,取最小值,最后让j等于最小值的j,依次类推。遇到边界,j-1=0,j+1>10做相应的处理即可。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% a=magic(10); [m1,n1]=min(a(1,:));%%得到第一行的最小值 M=zeros(10,3); M(1,1)=m1;M(1,2)=1;M(1,3)=n1;%%存储最小值和其坐标 j=n1;%%让j=第一行最小值的列 for i=2:10 if j-1==0 b1=a(i,j);b2=a(i,j);b3=a(i,j+1); elseif j+1==10%%对j-1==0和j+1==10做处理 b1=a(i,j-1);b2=a(i,j);b3=a(i,j); else b1=a(i,j-1);b2=a(i,j);b3=a(i,j+1); end b=[b1 b2 b3]; [m,n]=min(b);%%取最小值 M(i,1)=m;M(i,2)=i;%%存储最小值和行号,n是列号,因为不知道哪个值最小,所以要做判断 if n==1&j-1==0 j=j; elseif n==3&j+1==10 j=j; %%%边界处理 elseif n==1&j-1~=0 j=j-1; elseif n==2&j~=0 j=j; elseif n==3&j+1~=10 j=j+1; %%%其余情况处理,更新j end M(i,3)=j; %%存储列号 end M 运行结果: M = 1 1 3 7 2 3 20 3 4 3 4 5 2 5 4 76 6 3 5 7 2 6 8 2 10 9 1 11 10 1%%第一列为最小值,第二列为行号,第三列为列号。