1. 程式人生 > >codeVS之旅:1160 蛇形矩陣

codeVS之旅:1160 蛇形矩陣

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;
}