Z字形掃描
阿新 • • 發佈:2018-11-08
問題描述
在影象編碼的演算法中,需要將一個給定的方形矩陣進行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++; } } } }