wikioi 1160 蛇形矩阵
生活随笔
收集整理的這篇文章主要介紹了
wikioi 1160 蛇形矩阵
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*========================================================================
1160 蛇形矩陣
題目描述 Description小明玩一個數字游戲,取個n行n列數字矩陣(其中n為不超過100的奇數),數字的填補方法為:在矩陣中心從1開始以逆時針方向繞行,逐圈擴大,直到n行n列填滿數字,請輸出該n行n列正方形矩陣以及其的對角線數字之和.
輸入描述 Input Descriptionn(即n行n列)
輸出描述 Output Descriptionn+1行,n行為組成的矩陣,最后一行為對角線數字之和
樣例輸入 Sample Input3
樣例輸出 Sample Output5 4 36 1 27 8 925
數據范圍及提示 Data Size & Hint
==========================================================================*/
解析:
下面是n等于7和n等于5的時候數組的樣子:
? ?
填充數組的方式 如下:
先手動填充數字1(其位置為(n/2,n/2),如上圖所示。)
然后一層一層地填充其余部分的數據。(層數m=n/2)
對每一層的填充,按如下順序處理:
先填充右邊這一列(這一列最底下的數據先不填充,下同。)
接著填充上邊的橫行,然后填充左邊這一列,最后填充下邊的橫行。
(每一段的填充范圍如圖顏色所示。)
?
對第x層(1<=x<=m),填充某一段時,該段數據個數為2*x。
比如n=5,第一層每一段的個數是2,第二層每一段的個數是4.
n=7時,第三層每一段的個數是6.
……所以,每一段的循環次數k=2*x。
下面的代碼對這一點的處理稍微不同,但本質一樣。下面的k從2開始,k/2要小于或等于m即可。
(段與段之間要注意修改坐標)
下面是代碼:
#include<stdio.h> int main() {int i,j,n,a[100][100],k,m,t,p,sum=0;scanf("%d",&n);i=j=n/2;//最內層的1所在的位置 m=n/2;//循環填充的層數(不包括最內層的1) a[i][i]=1;t=2;//準備放進數組的數據for(k=2;k/2<=m;k=k+2) {j=j+1;for(p=1;p<=k;p++)//填充右側這一列{a[i][j]=t;t++;i--;}i++;j--;for(p=1;p<=k;p++)//填充上邊這一橫行{a[i][j]=t;t++;j--;}j++;i++;for(p=1;p<=k;p++)//填充左邊這一列{a[i][j]=t;t++;i++;}i--;j++;for(p=1;p<=k;p++)//填充下面這一橫行{a[i][j]=t;t++;j++;}j--;}for(i=0;i<n;i++)//輸出數組順便求對角線元素的和{for(j=0;j<n;j++){printf("%5d ",a[i][j]);if(i==j||i+j==n-1) sum=sum+a[i][j];}printf("\n");}printf("%d\n",sum);return 0; }?
轉載于:https://www.cnblogs.com/huashanqingzhu/p/3458514.html
總結
以上是生活随笔為你收集整理的wikioi 1160 蛇形矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构图之二(最小生成树--克鲁斯卡尔
- 下一篇: 常用数据表设计收集