1. 程式人生 > 其它 >AcWing 3208 Z字形掃描

AcWing 3208 Z字形掃描

題目描述:

在影象編碼的演算法中,需要將一個給定的方形矩陣進行Z 字形掃描(Zigzag Scan)。

給定一個n×n的矩陣,Z 字形掃描的過程如下圖所示:

zig.png

對於下面的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 字形掃描後的結果。

資料範圍

1≤n≤500,
矩陣元素為不超過1000 的正整數。

輸入樣例:

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
#include <iostream>
#include <cstdio>

using namespace std;
const int MAX = 509;

int a[MAX][MAX];
int ans[MAX * MAX];

int n;

bool check(int x, int y)
{
    if(x >= 0 && x < n && y >= 0 && y < n)
        return true;
    return false;
}

int main()
{
    scanf("%d", &n);

    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
            scanf("%d", &a[i][j]);
    }

    int N = n * n;
    int cnt = 1, k = 0;
    bool down = false; // down為false向右走,否則向下走
    int row = 0, col = 0;
    bool rightup = true; // true向右上方走,false向左下方走
    bool f = false;

    while(k < N)
    {
        for(int i = 0; i < cnt; i++)
        {
            ans[k++] = a[row][col];
            // printf("(%d, %d)  a = %d\n", row, col, a[row][col]);
            if(check(row - 1, col + 1) && rightup)
            {
                row--;
                col++;
            }
            if(check(row + 1, col - 1) && !rightup)
            {
                row++;
                col--;
            }
        }
        // printf("\n");

        if(cnt >= n)
            f = true;

        if(!f)
            cnt++;
        else
            cnt--;

        if(!down)
        {
            if(check(row, col + 1)) // 可以向右走
            {
                col ++;
                down = true;
            }
            else
                row++;
        }

        else
        {
            if(check(row + 1, col)) // 可以向下走
            {
                row++;
                down = false;
            }
            else
                col++;
        }
        rightup = !rightup;
    }

    N = n * n;
    for(int i = 0; i < N; i++)
        printf("%d ", ans[i]);

    return 0;
}