算法 - 蛇形矩阵输出

思路:
1. 创建n*n的二维数组。
2. 定义四个填充的方法,分别是→、↓、←、↑。
3. 当需要填充时,确定方向,然后从外向内遍历找到空缺的位置进行填充。

var print = function (n) {
    var lineArr = [];
    var j, k;
    for (j = 0; j < n; j++) {
        lineArr[j] = new Array();
        for (k = 0; k < n; k++) {
            lineArr[j][k] = undefined;
        }
    }

    var type = 1,
        typeCount = 4;
    var func = getFunc(type);
    for (var i = 1; i <= n * n; i++) {
        i = func(lineArr, n, i)
        type++;
        if (type > typeCount) type = 1;
        func = getFunc(type);
    }
    j = k = 0;

    for (; j < n; j++) {
        console.log(lineArr[j].join(' '));
    }
};
var getFunc = function (type) {
    switch (type) {
        case 1: return func1;
        case 2: return func2;
        case 3: return func3;
        case 4: return func4;
    }
}
//→
var func1 = function (lineArr, n, intNum) {
    var isBreakOutterFor = false;
    for (var i = 0; i <= Math.ceil(n / 2); i++) {//行
        for (var j = 0; j < n; j++) {//列
            if (typeof lineArr[i][j] == 'undefined') {
                lineArr[i][j] = intNum++;
                isBreakOutterFor = true;
            }
        }
        if (isBreakOutterFor) return intNum - 1;
    }
    return intNum;
}
//↓
var func2 = function (lineArr, n, intNum) {
    var isBreakOutterFor = false;
    for (var i = n - 1; i >= Math.floor(n / 2); i--) {//列
        for (var j = 0; j < n; j++) {//行
            if (typeof lineArr[j][i] == 'undefined') {
                lineArr[j][i] = intNum++;
                isBreakOutterFor = true;
            }
        }
        if (isBreakOutterFor) return intNum - 1;
    }
    return intNum;
}
//←
var func3 = function (lineArr, n, intNum) {
    var isBreakOutterFor = false;
    for (var i = n - 1; i >= Math.floor(n / 2); i--) {//行
        for (var j = n - 1; j >= 0; j--) {//列
            if (typeof lineArr[i][j] == 'undefined') {
                lineArr[i][j] = intNum++;
                isBreakOutterFor = true;
            }
        }
        if (isBreakOutterFor) return intNum - 1;

    }
    return intNum;
}
//↑
var func4 = function (lineArr, n, intNum) {
    var isBreakOutterFor = false;
    for (var i = 0; i < Math.floor(n / 2); i++) {//列
        for (var j = n - 1; j >= 0; j--) {//行
            if (typeof lineArr[j][i] == 'undefined') {
                lineArr[j][i] = intNum++;
                isBreakOutterFor = true;
            }
        }
        if (isBreakOutterFor) return intNum - 1;
    }
    return intNum;
}
print(6);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值