zoukankan      html  css  js  c++  java
  • 蛇形矩阵[模拟]

    蛇形矩阵[模拟]

    题目描述

    输入两个整数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;
        
        
    }
    
    追求吾之所爱
  • 相关阅读:
    规格说明书-----吉林1日游
    每周代码及工作总结(第九周)
    评论beta发布
    每周代码及工作总结(第八周)
    半年之后没啥意思,开个博客
    本周例行报告
    final发布评论Ⅱ
    课堂final发布
    本周例行报告
    回顾
  • 原文地址:https://www.cnblogs.com/rstz/p/14390971.html
Copyright © 2011-2022 走看看