zoukankan      html  css  js  c++  java
  • 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 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 using namespace std;
     7 const int maxn=1107;
     8 int mat[maxn][maxn];
     9 int ans[maxn*maxn];
    10 bool vis[maxn][maxn];
    11 int n;
    12 void solve()
    13 {
    14     memset(vis,0,sizeof(vis));
    15     int i=0,j=0,num=0;bool first=1,flag=0,point=1;
    16     while(1){
    17         ans[num++]=mat[i][j];
    18         vis[i][j]=1;
    19         if(i==n-1&&j==n-1) break;
    20         if(i==n-1&&j==0){
    21             if(vis[n-2][1]){i=n-1;j=1;point=0;first=0;continue;}
    22             else{i=n-2;j=1;point=0;first=0;continue;}
    23         }
    24         else if(j==n-1&&i==0){
    25             if(vis[1][n-2]){i=1;j=n-1;first=0;point=1;continue;}
    26             else {i=1;j=n-2;point=1;first=0;continue;}
    27         }
    28         if(i==0&&first){
    29             first=0;
    30             j=j+1;
    31             point=1;
    32         }
    33         else if(j==0&&first){
    34             i=i+1;
    35             point=0;
    36             first=0;
    37         }
    38         else if(i==n-1&&first){
    39             j=j+1;
    40             point=0;
    41             first=0;
    42         }
    43         else if(j==n-1&&first){
    44             i=i+1;
    45             point=1;first=0;
    46         }
    47         else if(point){
    48             i=i+1;;j=j-1;
    49             first=1;
    50         }
    51         else{
    52             first=1;
    53             i=i-1;j=j+1;
    54         }
    55     }
    56 }
    57 int main()
    58 {
    59   //   freopen("in.txt","r",stdin);
    60     while(~scanf("%d",&n)){
    61         for(int i=0;i<n;i++)
    62             for(int j=0;j<n;j++)
    63         {
    64             scanf("%d",&mat[i][j]);
    65         }
    66         solve();
    67         bool first=1;
    68         for(int i=0;i<n*n;i++)
    69         {
    70             if(first){
    71                  printf("%d",ans[i]);
    72                  first=0;
    73             }
    74             else printf(" %d",ans[i]);
    75         }
    76         printf("
    ");
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    Understand each field of AWR [ID 884046.1]
    Linux iptables 防火墙 添加删除 端口
    SCSI 总线和协议
    How to create physical standby database with 11g RMAN DUPLICATE FROM ACTIVE DATABASE [ID 747250.1]
    How to create physical standby database with 11g RMAN DUPLICATE FROM ACTIVE DATABASE [ID 747250.1]
    Linux iptables 防火墙 添加删除 端口
    Oracle alert log 按天 存放 脚本
    文件系统 和 网络附接存储(NAS: Network Attached Storage)
    SCSI 总线和协议
    IP(Internet Protocal) 地址 说明
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4366997.html
Copyright © 2011-2022 走看看