codeVS之旅:1160 蛇形矩陣
阿新 • • 發佈:2018-11-09
1160 蛇形矩陣 http://codevs.cn/problem/1160/
時間限制: 1 s
空間限制: 128000 KB
題目等級 : 白銀 Silver
題解
檢視執行結果
題目描述 Description
小明玩一個數字遊戲,取個n行n列數字矩陣(其中n為不超過100的奇數),數字的填補方法為:在矩陣中心從1開始以逆時針方向繞行,逐圈擴大,直到n行n列填滿數字,請輸出該n行n列正方形矩陣以及其的對角線數字之和.
輸入描述 Input Description
n(即n行n列)
輸出描述 Output Description
n+1行,n行為組成的矩陣,最後一行為對角線數字之和
樣例輸入 Sample Input
3
樣例輸出 Sample Output
5 4 3
6 1 2
7 8 9
25
資料範圍及提示 Data Size & Hint
解答:這個題是一個模擬題,我的解法就是從陣列中心開始模擬,按照,右,上,左,下的順序,走完一次算一輪。每次方向區分使用flag標記。關於每次走多少步,這裡我通過找規律發現的,應該是第一輪:右1,上1,左2,下2,。第二輪:右3,上3,左4,下4,可以看到右和上步數和論數k的關係是2*k-1=步數,左和下則是2*k=步數。因為conut是從0開始計數的,就寫成了程式碼中的判斷。最後再補足陣列的最後一行即可。關於對角線和只需要找出規律進行相加就可以了。
PS:這個題我幾度想放棄,可是看了看後面的題解,我感覺還是自己寫吧,題解沒有寫得很詳細的,而且其實看別人的答案就感覺自己已經輸了的感覺。
程式碼如下:
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int a[100][100]={0}; int i=n/2,j=n/2, k,x=1; int m=1; int count=0; int flag=0; a[i][j]=m; m++; for(k=1;k<=n/2;k++ ) { if(flag%4==0) { count=0; while(count<2*k-1) { j++; a[i][j]=m; m++; count++; } flag++; } if(flag%4==1) { count=0; while(count<2*k-1) { i--; a[i][j]=m; m++; count++; } flag++; } if(flag%4==2) { count=0; while(count<=2*k-1) { j--; a[i][j]=m; m++; count++; } flag++; } if(flag%4==3) { count=0; while(count<=2*k-1) { i++; a[i][j]=m; m++; count++; } flag++; } } int c = n*n-n+2; for(int i=n-1,j=1; j<n; j++) { a[i][j]= c; c++; } for(i=0; i<n; i++) { for(j=0; j<n; j++) { cout<<a[i][j]<<' '; } cout<<endl; } int sum =0; for(i=0; i<n; i++) { sum = sum + a[i][n-i]+a[i][i]; } sum =sum-a[i][i]; cout<<sum<<endl; return 0; }