蛇形矩阵[模拟]

蛇形矩阵[模拟]

题目描述

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

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

输入格式

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

输出格式

输出满足要求的矩阵。

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

数据范围

1≤n,m≤1001≤n,m≤100

输入样例:

3 3

输出样例:

1 2 3
8 9 4
7 6 5

思路分析

就像题目描述一样,先从最外边的圈圈开始填数,由外而内,将全部方格填满,最后就是答案。

  • 我们将没次填数的边界定位, l , r , t o p , d o w n l,r,top, down l,r,top,down, 可以通过这些边界,来找到确定的位置,然后一直模拟
  • 具体解释看java代码

AC代码

Java代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        
        int n = cin.nextInt();
        int m = cin.nextInt();
        
        int[][] a = new int[n][m];
        
        int l = 0, r = m - 1, top = 0, down = n - 1; // 从最外层开始填数
        int k = 1;
        while (l <= r && top <= down) {
            for (int i = l; i <= r; ++ i) { // 填当前层的上面一行
                a[top][i] = k ++;
            }
            
            for (int i = top + 1; i <= down; ++ i) { // 填当前层右边边一列
                a[i][r] = k ++;
            }
            
            for (int i = r - 1; i >= l && top < down; -- i ) { // 填当前层底部一行, top < down,是为了判断是否到达中间最后一行
                a[down][i] = k ++;
            }
            
            for (int i = down - 1; i > top && l < r; -- i) { // 填当前层左边一列, l < r 判断是否左边一行不用再填,只需要填横着的一行
                a[i][l] = k ++;
            }
            l ++; r--; top ++; down --;
        }
        for (int[] c : a) {
            for (int x : c) {
                System.out.print(x + " ");
            }
            System.out.println();
        }
    }
}

C++代码

#include <iostream>
using namespace std;
const int N = 105;
int a[N][N];

int main()
{
    int n, m;
    cin >> n >> m;
    int k = 1;
    int left = 0, right = m-1, top = 0, bottom = n-1;
    while(left <= right && top <= bottom)
    {
        for(int i = left; i <= right; ++ i)
            a[top][i] = k++;
        for(int i = top + 1; i <= bottom; ++ i)
            a[i][right] = k ++;
        for(int i = right-1; i >= left && top < bottom; -- i)
            a[bottom][i] = k ++;
        for(int i = bottom - 1; i > top && left < right; -- i)
            a[i][left] = k++;
        left++,right--,top++,bottom--;    
    }
    for(int i = 0; i < n; ++ i){
        for(int j = 0; j < m; ++ j)
            cout << a[i][j] <<" ";
        cout << endl;
    }
    return 0;
    
    
}
追求吾之所爱
原文地址:https://www.cnblogs.com/rstz/p/14390971.html