美文网首页
2020-01-15(ccf201412-2 Z字形扫描)

2020-01-15(ccf201412-2 Z字形扫描)

作者: V_6619 | 来源:发表于2020-01-17 17:13 被阅读0次

问题描述

在图像编码的算法中,需要将一个给定的方形矩阵进行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的正整数。

思路
由于路线有一定的规律,所以用 turn来表示
\color{red}{注意:} 会发生改变方向,并不是一直按照规律来。

Code

#include <iostream>
 using namespace std;
 int main()
 {
    int n;
    cin>>n;
    int a[n][n];
    for(int i=0; i<n; i++)
      for(int j=0; j<n; j++)
        cin>>a[i][j];
    /*   
       若是向右或向下只延伸一个单位 
       一直是按照     右, 左下, 下, 右上   的顺序依次而来 
    */
    
    int turn = 0;
    int i=0;
    int j=0;
    bool flag; //改变方向布尔值 
        for(; ; )
          {
             
             if(i==n-1 && j==n-1) break;
             
             if(turn == 0) // turn为 0 时,  向右 
               {
                  if(j == n-1) //i已经到头,不能向右 
                    {
//                   cout<<a[i][j]<<" ";
                      turn = 2;   
                      flag = true;      
                    } 
                   else
                       {
                         cout<<a[i][j]<<" ";
                         j += 1; 
                         turn = (turn + 1) % 4;
                         if(flag == true) turn = 3;
                       }
               }
             else if(turn == 1) // turn为 1 时,  左下 
               {
                
                  while(j != 0 && i != n-1)
                  {
                     cout<<a[i][j]<<" ";
                     i += 1;
                     j -= 1;    
                 }
//               cout<<a[i][j]<<" ";
                 turn = (turn + 1) % 4;
                 if(flag == true) turn = 0;
               }
             else if(turn == 2)  // turn为 2 时, 向下 
               {
                 if(i == n-1)  // i已经到头,不能向下 
                   {
//                      cout<<a[i][j]<<" ";
                        turn = 0;
                        flag = true;    
                   }
                   else
                   {
                    cout<<a[i][j]<<" ";
                    i += 1; 
                    turn = (turn + 1) % 4;
                    if(flag == true) turn = 1;
                   }
                           
               }
               
            else  //turn为 3 时,  右上
              {
                  while (i != 0 && j != n-1)
                    {
                        cout<<a[i][j]<<" ";
                        i -= 1;
                        j += 1;
                    }
                 turn = (turn + 1) % 4;
                  if(flag == true) turn = 2;
              } 
              
            
          }
       cout<<a[n-1][n-1];
 }

相关文章

  • 2020-01-15(ccf201412-2 Z字形扫描)

    问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan)。给定一个n×n的矩...

  • csp-2014-12-02Z字形扫描

    Program Description | 201412-2 || 试题名称: | Z字形扫描 || 时间限制: ...

  • 201412-2 Z字形扫描

    试题编号:201412-2试题名称:Z字形扫描时间限制:2.0 s内存限制:256.0 MB问题描述:在图像编码的...

  • z字形

    解法二,每一行定义一个stringbuilder,

  • CCF201412-2Z字形扫描(JAVA版)

  • Z字形变换

    Z字形变换 将字符串"PAYPALISHIRING"以Z字形排列成给定的行数: P A H N A ...

  • LeetCode解题记录(6~10)

    6.Z字形变换 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: PAH NAPLSI...

  • Z字形变换

    题目描述 解题思路 解析参考自acwing,作者:adnil8130 Python代码 代码描述 第一行和最后一行...

  • Z字形变换

    题目区(源自于leetcode) 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入...

  • Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "LEETCODEIS...

网友评论

      本文标题:2020-01-15(ccf201412-2 Z字形扫描)

      本文链接:https://www.haomeiwen.com/subject/nkqtzctx.html