网站建设是什么岗位,jsp两种网站开发模式,网站开发高级工程师,开发网站开发工程师来自知乎问题#xff0c;觉得挺有意思#xff0c;留给学生解答之余#xff0c;我也做了一番思考#xff0c;得到三种解法。题目如下#xff1a;以n80为例#xff0c;————————————————————一、先要根据确定矩阵的阶数 如果先生成足够大矩阵#xff0…来自知乎问题觉得挺有意思留给学生解答之余我也做了一番思考得到三种解法。题目如下以n80为例————————————————————一、先要根据 确定矩阵的阶数 如果先生成足够大矩阵再删掉全为零的列有点太low了。所以先思考一个算法观察数据放置的特点不难发现这样一个关系变形观察若 足够大 起决定作用 取整一定是 较小的 (或 ) 对吗试一试。测试 至 :n1:56;round(sqrt(2*n))刚好是对的二、将 按斜线依次放置无非是找到放置规律放数而已放置就是用行标列标赋值所以就是找行标、列标规律。先写个数的方便观察规律比如方法一. 行标、列标分别找规律 依次赋值的行标 共 组 个数列标 共 组 个数(因为是 条斜线)既然如此按上述规律生成(拼接)行标、列标再赋值即可。编写函数functionADiagNum1(n)kround(sqrt(2*n)); %确定矩阵阶数kAzeros(k);%% 生成行标, 列标I[];J[];for i1:kI[I,1:i];J[J,i:-1:1];endINDsub2ind(size(A),I,J); %二维索引转化为一维索引A(IND(1:n))1:n;注意生成行标列标索引后[I, J]作为二维索引值是不能直接用A([I,J])1:n来赋值的故做了二维索引到一维索引的转化。测试函数DiagNum1(80)方法二. 行标列标一起找规律 依次赋值的行标和列标先是“和为 ”的再“和为 ”的再“和为 ”的……; 每个子组里面又是行标从小到大排列。因此先生成所有行标列标组合( 与 的笛卡尔积)第一关键字按行标列标之和排序再第二关键字按行标排序排好序的取出前 个依次赋值 即可。编写函数functionADiagNum2(n)kround(sqrt(2*n)); %确定矩阵阶数kAzeros(k);%% 生成所有下标组合(笛卡尔积)[X,Y]meshgrid(1:n,1:n);subn[X(:),Y(:)];%% 选取索引并赋值indsortrows([subn,sum(subn,2)],3); %对下标求和, 按该和排序, 已经满足要求INDsub2ind(size(A), ind(1:n,1),ind(1:n,2)); %选出前n个二维索引, 并转化为一维A(IND)1:n;测试函数(略)方法三. 用循环语句实现用循环语句控制行标、列标按该规律出现依次赋值编写函数functionADiagNum3(n)kround(sqrt(2*n)); %确定矩阵阶数kAzeros(k);val1;for m1:kfor i1:mA(i,m1-i)val;valval1;if valnbreak;endendend注意外层循环用 控制依次从第 列到第 列起始的斜线对每条斜线先循环 从 到 而始终有 .测试函数(略)三、稍微提升一下只赋值 , 实用性不大如果改进一下对给定的一个向量 , 将 中的值依次按斜线方向赋值成矩阵呢非常简单参数由 换成向量 , 则 的长度即为需要的 再将最后赋值时用的 换成 即可。改进的第一个函数functionADiagNum1(V)nlength(V);kround(sqrt(2*n)); %确定矩阵阶数kAzeros(k);%% 生成行标, 列标I[];J[];for i1:kI[I,1:i];J[J,i:-1:1];endINDsub2ind(size(A),I,J); %二维索引转化为一维索引A(IND(1:n))V;改进的第二个函数functionADiagNum2(V)nlength(V);kround(sqrt(2*n)); %确定矩阵阶数kAzeros(k);%% 生成所有下标组合(笛卡尔积)[X,Y]meshgrid(1:n,1:n);subn[X(:),Y(:)];%% 选取索引并赋值indsortrows([subn,sum(subn,2)],3); %对下标求和, 按该和排序INDsub2ind(size(A), ind(1:n,1),ind(1:n,2)); %选出前n个二维索引, 并转化为一维A(IND)V;改进的第三个函数(稍有不同)functionADiagNum3(V)nlength(V);kround(sqrt(2*n)); %确定矩阵阶数kAzeros(k);val1;for m1:kfor i1:mA(i,m1-i)V(val);valval1;if valnbreak;endendend若还要得到原问题的结果只需这样调用函数即可DiagNum1(1:n)DiagNum2(1:n)DiagNum3(1:n)原创文章转载请注明。