zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JS从0到1——756. 蛇形矩阵

JS 矩阵 蛇形
2023-09-14 09:14:57 时间

文章目录

Question

输入两个整数 n
和 m
,输出一个 n
行 m
列的矩阵,将数字 1
到 n×m
按照回字蛇形填充至矩阵中。

具体矩阵形式可参考样例。

输入格式
输入共一行,包含两个整数 n
和 m

输出格式
输出满足要求的矩阵。

矩阵占 n
行,每行包含 m
个空格隔开的整数。

数据范围
1≤n,m≤100
输入样例:
3 3
输出样例:
1 2 3
8 9 4
7 6 5

Ideas

  • 利用偏移量解决

Code

let buf = "";

process.stdin.on("readable", function() {
    let chunk = process.stdin.read();
    if (chunk) buf += chunk.toString();
});

process.stdin.on("end", function() {
    // 使用偏移量解决,有点像BFS里面的扩展队首
    let [n, m] = buf.split(' ').map((x)=>{return parseInt(x)});
    
    // 全部初始化为0
    let res = [];
    for (let i = 0; i < n; i ++){
        res[i] = [];
        for (let j = 0; j < m; j ++){
            res[i].push(0);
        }
    }   

    let dx = [-1,0,1,0], dy = [0,1,0,-1];
    // (x,y)当前的坐标,d移动的方向,一开始向右走
    let x = 0, y = 0, d = 1;
    for (let i = 1; i <= n * m; i ++){
        res[x][y] = i;
        let a = x + dx[d], b = y + dy[d];
        // 走到头,需要转向
        if (a < 0 || a >= n || b < 0 || b >= m || res[a][b]){
            d = (d + 1) % 4; // 改变方向
            a = x + dx[d], b = y + dy[d];
        }
        x = a, y = b;
    }
    
    for (let i = 0; i < n; i ++){
        line = "";
        for (let j = 0; j < m; j ++){
            line += res[i][j] + ' ';
        }
        console.log(line);
    }
});