201412-2 Z字形掃描(c語言)


問題描述
  在圖像編碼的算法中,需要將一個給定的方形矩陣進行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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM