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來控制就好了。不過我是懶得改寫了呵呵)