zoukankan      html  css  js  c++  java
  • CSP认证201412-2-Z字形扫描-(Java)100分

    Z字形扫描

    试题编号: 201412-2
    试题名称: Z字形扫描
    时间限制: 2.0s
    内存限制: 256.0MB
    问题描述
      在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩阵,Z字形扫描的过程如下图所示:
    在这里插入图片描述

    对于下面的4×4的矩阵,
      1 5 3 9
      3 7 5 6
      9 4 6 4
      7 3 1 3
      对其进行Z字形扫描后得到长度为16的序列:
      1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
      请实现一个Z字形扫描的程序,给定一个n×n的矩阵,输出对这个矩阵进行Z字形扫描的结果。
    输入格式
      输入的第一行包含一个整数n,表示矩阵的大小。
      输入的第二行到第n+1行每行包含n个正整数,由空格分隔,表示给定的矩阵。
    输出格式
      输出一行,包含n×n个整数,由空格分隔,表示输入的矩阵经过Z字形扫描后的结果。
    样例输入
    4
    1 5 3 9
    3 7 5 6
    9 4 6 4
    7 3 1 3
    样例输出
    1 5 3 9 7 3 9 5 4 7 3 6 6 4 1 3
    评测用例规模与约定
      1≤n≤500,矩阵元素为不超过1000的正整数。

    Java满分
    在这里插入图片描述
    规律
    eg: n=5
    输入 n = 5
    斜着有 (2n-1) = 9 行, 这里用 0-8 表示

    斜序号(i)坐标(x,y)坐标个数(count)坐标最大数(max)
    0(0,0)10
    1(0,1) (1,0)21
    2(2,0) (1,1) (0,2)32
    3(0,3) (1,2) (2,1) (3,0)43
    4(4,0) (3,1) (2,2) (1,3) (0,4)54
    5(1,4) (2,3) (3,2) (4,1)44
    6(4,2) (3,3) (2,4)34
    7(3,4) (4,3)24
    8(4,4)14

    斜序号为奇数时,y=坐标最大数,x=i-y
    斜序号为偶数时,x=坐标最大数,y=i-x

    Java代码

    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int[][] point = new int[n][n];
            for ( int i = 0; i < n; i++ )
                for ( int j = 0; j < n; j++ )
                    point[i][j] = sc.nextInt();
    
            int max = 0;       // 坐标最大数
            int count = 0;     // 坐标个数
            int incre = 0;     // incre为x的增量
            int x = 0, y = 0;  // 坐标
            for ( int i = 0; i < 2*n-1; i++ ){
                if ( i < n ) max = i;
    
                if ( i % 2 == 1 ) { y = max; x = i - max; incre = 1; }
                else { x = max; y = i - max; incre = -1; }
    
                if ( i < n ) count = i + 1;
                else count = 2 * n - 1 - i;
    
                for ( int j = 1; j <= count; j++){
                    System.out.print(point[x][y] + " ");
                    x += incre;
                    y -= incre;  // y与x变化相反
                }
            }
            System.out.println();
            sc.close();
        }
    }
    
  • 相关阅读:
    利用border-radius画椭圆
    关于使用svg构建六边形蜂巢列表的方式
    JavaScript拖拽效果的原理及实现
    逆战班-JS的形参与实参
    前端面试&笔试汇总
    less学习---less的混合(mixin)
    less学习---less的嵌套规则
    less学习----less变量
    vue-cli3实现将数据导出为Excel表
    js中apply和call方法浅析
  • 原文地址:https://www.cnblogs.com/jiaohuadehulike/p/14294967.html
Copyright © 2011-2022 走看看