流式输出一个矩阵所有子矩阵

    
    //行列数
    var m=5,n=6;
    //子矩阵行列数
    var r=3,d=3;
    //矩阵内数值最大值
    var maxNumber=16;

    /**
     * 流式序列,从0~m这m+1个数中不重复取出有序的n个数
     * @param m
     * @param n
     * @returns {*}
     */
    function subArrayIndex(m,n){
        if(n>m||m<=0) return null;
        var startX=0,pStack=[];
        return {
            next:function(){
                if(n==1){
                    return startX<=m?(cstartX++):null;
                }
                while(true){
                    while((n-pStack.length)!=1){
                        pStack[pStack.length]=startX++;
                        continue;
                    }
                    if(pStack[0]>(m-n+1)){
                        return null;
                    }
                    if(startX<=m){
                        var arr=[];
                        for(var i=0;pStack[i]!=undefined;++i){
                            arr[i]=pStack[i];
                        }
                        arr[arr.length]=startX++;
                        return arr;
                    }
                    while(pStack.length>0){
                        var preX=pStack.pop();
                        preX++;
                        if(preX<m){
                            pStack[pStack.length]=preX;
                            startX=preX+1;
                            break;;
                        }
                    }
                }
            },
        };
    }

    function outputMatrix(m){
        var output="",fixChar=' ',len=(maxNumber+"").length;
        var fixLength=function(d){
            var f=d+"";
            for(var k=len-(d+"").length;k>0;--k){
                f=fixChar+f;
            }
            return f;
        }
        m.map(function(a){
            a.map(function(b){
                output+="  "+fixLength(b);
            });
            output+="\n";
        });
        return output;
    }
   

    var matrix=[],colSeq=[],rowSeq=[],current={};
    var index=0;
    function refresh(){
        //$(".matrix").remove();
        var x=document.getElementsByClassName("matrix");
        var aaa=[];
        for(var k=0;k<x.length;++k){
            aaa[k]=x[k];
        }
        aaa.map(function(f){f.remove()})
        var str= "大矩阵为"+m+"行"+n+"列,子矩阵为"+r+"行"+d+"列\n";
        //生成一个随机矩阵
        for(var i=0;i<m;++i){
            matrix[i]=[];
            for(var j=0;j<n;++j){
                matrix[i][j]=Math.floor(Math.random()*16);
            }
        }
        outputHtml(str+outputMatrix(matrix))
        colSeq=subArrayIndex(m-1,r);
        current=colSeq.next();
        rowSeq=subArrayIndex(n-1,d);
        index=0;
        drawNext();
    }

    function drawNext(){
        var cx=current;
        var rx=rowSeq.next();
        if(rx==null){
            current=colSeq.next();
            rowSeq=subArrayIndex(n-1,d);
        }
        if(cx==null) return ;
        if(cx&&rx){
            var arr=[];
            for(var i=0;i<cx.length;++i){
                arr[i]=[];
                for(var j=0;j<rx.length;++j){
                    arr[i][j]=matrix[cx[i]][cx[j]];
                }
            }
            outputHtml("第"+index+"个\n行号"+cx+"  列号"+rx+"\n"+outputMatrix(arr));
            index++;
        }
    }


    //输出结果
    function outputHtml(str){
       console.log(str+"\n");
    }

    //计算和输出随机大矩阵与第0个子矩阵
    refresh();
    //计算和输出第1个子矩阵
    drawNext();
    //计算和输出第2个子矩阵
    drawNext();
    //计算和输出第3个子矩阵
    drawNext();
    //计算和输出第4个子矩阵
    drawNext();
    //计算和输出第5个子矩阵
    drawNext();

     ………………


猜你喜欢

转载自blog.csdn.net/qq631431929/article/details/78500126
今日推荐