問題描述 在圖像編碼的演算法中,需要將一個給定的方形矩陣進行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 ...
問題描述 在圖像編碼的演算法中,需要將一個給定的方形矩陣進行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的正整數。
思路: 我們把所走路徑的坐標寫下來,觀察規律會發現其橫縱坐標之和會有規律,橫縱坐標之和為0到2*n-2,然後我們分別分析和為1,2 3......2*n-2這幾組規律,當和小於n的時候,當和大於等於n的時候不難發現其規律。
1 #include<stdio.h> 2 int main() 3 { 4 int n,i,ii,temp,j; 5 scanf("%d",&n); 6 int a[n][n]; 7 for(i=0;i<n;i++) 8 for(j=0;j<n;j++) 9 scanf("%d",&a[i][j]); 10 printf("%d ",a[0][0]); 11 for(ii=1;ii<n*2;ii++) 12 { 13 if(ii<n) 14 { 15 if(ii%2==1)//奇數則是從小到大 16 { 17 for(i=0;i<ii+1;i++) 18 printf("%d ",a[i][ii-i]); 19 } 20 else//偶數則是從大到小 21 { 22 for(i=0;i<ii+1;i++) 23 printf("%d ",a[ii-i][i]); 24 } 25 } 26 else 27 { 28 if(ii%2==1)//奇數則是從小到大,輸出次數為2*n-ii次,橫坐標是從ii-n+1開始 29 { 30 for(i=0;i<2*n-1-ii;i++) 31 printf("%d ",a[ii-n+1+i][n-1-i]); 32 } 33 else 34 { 35 for(i=0;i<2*n-1-ii;i++) 36 printf("%d ",a[n-1-i][ii-n+1+i]); 37 } 38 } 39 } 40 }