1. 程式人生 > >ccf Z字形掃描

ccf Z字形掃描

問題描述   在影象編碼的演算法中,需要將一個給定的方形矩陣進行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>
#include <cstdio>
#include <cstring>
using namespace std;
struct pos{
	int x, y;
};
const int size = 501;
int array[size][size] = {0};

inline void print_pos(pos &p)
{
	cout << " " << array[p.y][p.x];
}
inline bool judge(pos &p, int n)
{
	return (p.x >n || p.y > n);
}
int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			cin >> array[i][j];
	
	pos start = {1, 1};
	cout << array[1][1];
	while (true)
	{
		// 現在要做的是模擬z字形的路徑
		// 先橫向,如果到達邊界,則向下 
		pos next;
		
		if (start.x == n)
		{
			next.y = start.y + 1;
			next.x = start.x;
		}
		else
		{
			next.y = start.y;
			next.x = start.x + 1;
		}
			
		if (judge(next, n)) break;
		print_pos(next);
		// 然後是向左下斜向前進
		while (next.x > 1 && next.y < n)
		{
			next.x = next.x - 1;
			next.y = next.y + 1;
			print_pos(next);
		}
		//然後是向下前進,如果到達邊界,則向右前進
		if (next.y == n) 
			next.x += 1;
		else
			next.y += 1;
		//next.x = next.x;
		if (judge(next, n)) break;
		print_pos(next);
		// 然後是斜向右上方前進 
		while (next.x < n && next.y > 1)
		{
			next.x += 1;
			next.y -= 1;
			print_pos(next);
		}
		// 一次模擬完成了,然後要做的是迴圈即可 
		start = next;
		
	}
	printf("\n"); 
	return 0;
}