蛇形填充數組


http://noi.openjudge.cn/ch0108/24/

總時間限制: 
1000ms
 
內存限制: 
65536kB
描述

用數字1,2,3,4,...,n*n這n2個數蛇形填充規模為n*n的方陣。

蛇形填充方法為:

對於每一條左下-右上的斜線,從左上到右下依次編號1,2,...,2n-1;按編號從小到大的順序,將數字從小到大填入各條斜線,其中編號為奇數的從左下向右上填寫,編號為偶數的從右上到左下填寫。

比如n=4時,方陣填充為如下形式:

1  2  6  7
3  5  8  13
4  9  12 14
10 11 15 16
輸入
輸入一個不大於10的正整數n,表示方陣的行數。
輸出
輸出該方陣,相鄰兩個元素之間用單個空格間隔。
樣例輸入
4
樣例輸出
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16

分析:這個題目要注意看輸入輸出案例當中蛇形數組的排列順序,按題目的意思來操作。

這里把方陣分成左上三角(包括主對角線)和右下三角兩個部分分別處理。

上三角部分斜排數等於n,為了便於處理,斜排序列k從0~(n-1)。

下三角部分斜排數是n-1,斜排序列k從1到n-1.

對上三角而已,k為偶數時,斜排從小網上走;當k為奇數時剛好相反。

但是要注意:下三角斜排的方向不能這樣確定。當n的奇偶性不同的時候,上三角末尾斜排的方向也不一樣,導致了下三角起始斜排的方向不同。這里用一個flag變量來標識下三角起始斜排的方向。

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int main(int argc, char *argv[])
 4 {
 5     int n,i,j,t;
 6     int **a;
 7     int k;
 8     int flag;
 9     
10     scanf("%d",&n);
11     a=(int **)malloc(sizeof(int*)*n);
12     for(i=0;i<n;i++) a[i]=(int *)malloc(sizeof(int)*n);
13     
14     t=0;
15     for(k=0;k<n;k++)//填充左上三角部分(包括主對角線) 
16     {
17         if((k&1)==0)//第奇數個斜排,從左下往右上掃描填充 
18         {
19             i=k;
20             j=0;
21             for(;i>=0;i--,j++)
22             {
23                 t++;
24                 a[i][j]=t;
25             }
26         }
27         else//第偶數個斜排,從右上往左下掃描填充 
28         {
29             i=0;
30             j=k;
31             for(;j>=0;i++,j--)
32             {
33                 t++;
34                 a[i][j]=t;
35             }
36         }
37     }
38     
39     if((n&1)==0) //flag等於0或1決定了右下三角部分第一個斜排的方向 
40         flag=1;
41     else flag=0;
42     for(k=1;k<n;k++)//右下三角部分(不包括主對角線) 
43     {
44         if(flag==1)//從左下往右上掃描填充 
45         {
46             i=n-1;
47             j=k;
48             for(;j<n;j++,i--)
49             {
50                 t++;
51                 a[i][j]=t;
52             }
53             flag=0; 
54         }
55         else//從右上往左下掃描填充 
56         {
57             i=k;
58             j=n-1;
59             for(;i<n;i++,j--)
60             {
61                 t++;
62                 a[i][j]=t;
63             }
64             flag=1;
65         }
66     }
67     
68     for(i=0;i<n;i++)
69     {
70         for(j=0;j<n;j++)
71             printf("%d ",a[i][j]);
72         printf("\n");
73     }
74     return 0;
75 }

 其實,可以完全由flag變量控制上三角和下三角各個斜排的方向。(也就是說上三角部分的斜排也用flag來控制就好了。不過我是懶得改寫了呵呵)

 


免責聲明!

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



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