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

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的正整數。

 思路:

不難發現,每一條斜路線的x+y都是相等的,下一條的則+ 1,所以可以從這個角度入手,程式碼如下:


import java.util.*;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Main {
 
	
	public static void main(String[] args) {
		Scanner scanner= new Scanner(System.in);
		Main main= new Main();
		
		int n= scanner.nextInt();
		int [][] array= new int[n+ 5][n+ 5];
		
		for(int i= 0; i< n; i++)
			 for(int j= 0; j< n; j++)
				  array[i][j]= scanner.nextInt();//輸入二維陣列的各個值
		
		int sum= 0;//每一個斜路線的x和y的和
		int x= 0;
		int y= 0;
		int num= 0;//記錄輸出了幾個元素
		while(true) {//從左上角到對角線的遍歷
			
			while(true) {
				x= sum- y;
				System.out.print(array[x][y]+ " ");
				num++;
				
				if(x== 0)
					break;
				else
					y++;
			}
			sum++;
			if(num== n*n)
				break;
			if(sum>= n)
				break;
			
			while(true) {
				y= sum- x;
				System.out.print(array[x][y]+ " ");
				num++;
				if(y== 0)
					break;
				else
				  x++;
			}
			sum++;
			if(num== n*n)
				break;
			
			if(sum>= n)
				break;
		}
       
       int k= 1;
       

       if(x== 0)//用來判斷矩陣是奇數還是偶數的,分別實行相應的操作,偶數x遍歷到對角線時是0
    	   k= 2;
       if(num< n* n)
		while(true) {//從對角線到右下角的遍歷
			
			if(k%2== 1) {//n是偶數時進來
              while(true) {
				y= sum- x;
				
				System.out.print(array[x][y]+ " ");
				num++;
				if(y== n- 1)
					break;
				else
					x--;
	
			  }
			   if(num== n*n)
				break;
			   if(x== n- 1&&y== n- 1)
				break;
			   sum++;	
			   k++;
			}
			
			
			if(k%2== 0) {//n是奇數時進來
			  while(true) {
				x= sum- y;
				
				System.out.print(array[x][y]+ " ");
				num++;
				if(x== n- 1)
					break;
				else
					y--;

			}
			sum++;
			if(num== n*n)
				break;
			if(x== n- 1&&y== n- 1)
				break;
            k++;				
			}

		}
	}
}