• CCF 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的正整数。
     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int n;
     6 int a[505][505];
     7 
     8 bool isBad(int h,int l) {    //位置越界判断 
     9     return (h<0 || l<0 || h>=n ||l>=n);
    10 }
    11 
    12 bool PutMove(int prvs, int h, int l) {    //prvs代表经过什么移动到达第h行、第l列的位置 
    13     if (prvs == -1){    //除第一个数以外,其他数加空格输出 
    14         cout << a[h][l];
    15         if (!isBad(h,l+1))        //其右没越界 
    16             PutMove(1,h,l+1);    //向右移动
    17     }        
    18     else
    19         cout << " " << a[h][l];
    20     if (h == n-1 && l == n-1)    //递归结束 
    21         return true;
    22     switch(prvs) {
    23         case 0:        //
    24             if (!isBad(h-1,l+1))    //其右上没越界
    25                 PutMove(3,h-1,l+1);    //向右上移动 
    26             else
    27                 PutMove(2,h+1,l-1);    //向左下移动
    28             break;
    29         case 1:        //
    30             if (!isBad(h+1,l-1))    //其左下没越界
    31                 PutMove(2,h+1,l-1);    //向左下移动            
    32             else
    33                 PutMove(3,h-1,l+1);    //向右上移动 
    34             break;
    35         case 2:        //
    36             if (!isBad(h+1,l-1))    //其左下没越界
    37                 PutMove(2,h+1,l-1);    //向左下移动 
    38             else if (!isBad(h+1,l))    //其下没越界 
    39                 PutMove(0,h+1,l);    //向下移动 
    40             else
    41                 PutMove(1,h,l+1);    //向右移动
    42             break;
    43         case 3:        //
    44             if (!isBad(h-1,l+1))    //其右上没越界
    45                 PutMove(3,h-1,l+1);    //向右上移动 
    46             else if (!isBad(h,l+1))    //其右没越界 
    47                 PutMove(1,h,l+1);    //向右移动
    48             else
    49                 PutMove(0,h+1,l);    //向下移动 
    50             break;    
    51     } 
    52 }
    53 
    54 int main() {
    55     cin >> n;
    56     int i,j;
    57     for (i=0;i<n;i++)
    58         for (j=0;j<n;j++)
    59             cin >> a[i][j];
    60     PutMove(-1,0,0);
    61     return 0;
    62 }
    View Code
     
    思路:递归判断选择移动方式
    移动方式: 开始  ↓  →  ↙  ↗
    prvs对应值:-1   0   1   2   3
     
    注意:n=1时是特例,需要判断防止越界造成运行错误
     
     
     
  • 相关阅读:
    EasyUI笔记(三)Window窗口
    EasyUI笔记(二)Layout布局
    从零构建Flink SQL计算平台
    从零构建Flink SQL计算平台
    Hystrix压测
    Java对象属性复制备忘
    Java垃圾回收手册翻译
    一次虚拟机升级和参数调整记录
    获取不同虚拟机参数的终极方法
    Dataset数据的XML持久化处理
  • 原文地址:https://www.cnblogs.com/ttzm/p/5885847.html
Copyright © 2020-2023  润新知