问题描述
试题编号: 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 <stdio.h>
#include <iostream>
#include <queue>
#include <map>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string.h>
#define RIGHT 1
#define DOWN 3
#define XIE_UP 4
#define XIE_DOWN 2
using namespace std;
int a[505][505];
int n;
bool C(int x, int y) {
if (1 <= x && x <= n && 1 <= y && y <= n)
return true;
else
return false;
}
int main() {
// freopen("in.txt", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf("%d", &a[i][j]);
}
}
// init
int x = 1;
int y = 1;
int st = RIGHT;
int show = 0;
int is_down = 0;
printf("%d ", a[x][y]);
while(1) {
if (x == n && y == n) {
break;
}
switch (st) {
case RIGHT:
if (C(x, y+1)) {
y = y + 1;
printf("%d ", a[x][y]);
if (is_down == 1)
st = XIE_UP;
else
st = XIE_DOWN;
}
break;
case XIE_DOWN:
if (C(x+1, y-1)) {
x++;
y--;
printf("%d ", a[x][y]);
st = XIE_DOWN;
} else {
st = DOWN;
}
is_down = 1;
break;
case DOWN:
if (C(x+1, y)) {
x++;
printf("%d ", a[x][y]);
if (is_down == 1)
st = XIE_UP;
else
st = XIE_DOWN;
} else {
st = RIGHT;
}
break;
case XIE_UP:
if (C(x-1, y+1)) {
x--;
y++;
printf("%d ", a[x][y]);
st = XIE_UP;
} else if (C(x, y+1)){
y++;
printf("%d ", a[x][y]);
st = XIE_DOWN;
} else {
st = DOWN;
show = 1;
}
is_down = 0;
break;
}
}
}