原题:
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的正整数。 分析:啊哈哈哈,感觉找到了这类题目的通法,很简单,看代码。
代码:
#include <iostream> using namespace std; int main() { int n,tot = 0; cin>>n; int num[n + 1][n + 1]; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) cin>>num[i][j]; int a = 1,b = 1,c = 1; //c为状态:1向右,2左下,3向下,4右上 while(a + b <= 2 * n - 1) { switch(c) { case 1: cout<<num[a][b++]<<" "; if(a == 1) c = 2; if(a == n) c = 4; break; case 2: cout<<num[a++][b--]<<" "; if(b == 1) c = 3; if(a == n) c = 1; break; case 3: cout<<num[a++][b]<<" "; if(b == 1) c = 4; else c = 2; break; case 4: cout<<num[a--][b++]<<" "; if(a == 1 && b != n) c = 1; else if(b == n) c = 3; break; } } cout<<num[a][b]; return 0; }
java版
public class Z字形 { /** * @param args */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); // int m = sc.nextInt(); int num[][] = new int[n][n]; for(int i = 0;i < n;i++){ for(int j = 0;j < n;j++){ num[i][j] = sc.nextInt(); } } int tot = n * n; int t = 1,a = 0,b = 0; while(t < tot){ if((b + 1) < n && num[a][b + 1] != 0){ System.out.print(num[a][b++] + " "); num[a][b - 1] = 0; t++; } while((a + 1) < n && (b - 1) >= 0 && num[a + 1][b - 1] != 0){ System.out.print(num[a++][b--] + " "); num[a - 1][b + 1] = 0; t++; } if((a + 1) < n && num[a + 1][b] != 0){ System.out.print(num[a++][b] + " "); num[a - 1][b] = 0; t++; } while((a - 1) >= 0 && (b + 1) < n && num[a - 1][b + 1] != 0){ System.out.print(num[a--][b++] + " "); num[a + 1][b - 1] = 0; t++; } } System.out.print(num[a][b]); } }