1. 程式人生 > >基於Visual C++2012拆解世界五百強面試題--題3

基於Visual C++2012拆解世界五百強面試題--題3

請用C語言實現 輸入N,列印N*N矩陣

比如 N = 3, 列印:

1 2 3

8 9 4

7 6 5

N = 4, 列印

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

啟動2012

輸出結果

#include <stdio.h>
#include <stdlib.h>

#define M 5
int arr[M][M] = { 0 }; //初始化陣列全0 ,用0來判斷陣列是否賦有正確的值

void HuiJu(void);   //矩陣賦值函式
void ShowArr(void); //輸出矩陣

int main()
{
    HuiJu();
    ShowArr();

    system("pause");
    return 0;
}

void ShowArr(void)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < M; i++)
    {
        for (j = 0; j < M; j++)
        {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }
}

void HuiJu(void)
{
    int i = 0; //陣列索引
    int j = 0; //陣列索引
    int direc = 1; //方向控制
    int num = 1; //給陣列進行賦值的變數

    while (num <= M*M)//對矩陣迴圈賦值
    {
        switch (direc)
        {
        case 1:     //從左到右
            while (arr[i][j] == 0 && j < M) //陣列值為0以及索引j沒有越界時進行
            {
                arr[i][j] = num;
                num++;
                j++; //i不變 j遞增
            }
            j--; //改變索引為下一個變數的索引
            i++; //改變索引為下一個變數的索引
            direc = 2;//把方向從左到右改變為從上到下
            break;

        case 2:     //從上到下
            while (arr[i][j] == 0 && i < M)//陣列值為0以及索引i沒有越界時進行
            {
                arr[i][j] = num;
                num++;
                i++; //j不變 i遞增
            }
            i--; //改變索引為下一個變數的索引
            j--; //改變索引為下一個變數的索引
            direc = 3;//把方向從上到下改變為從右到左
            break;

        case 3:     //從右到左
            while (arr[i][j] == 0 && j >= 0)//陣列值為0以及索引j沒有越界時進行
            {
                arr[i][j] = num;
                num++;
                j--; //i不變 j遞減
            }
            j++; //改變索引為下一個變數的索引
            i--; //改變索引為下一個變數的索引
            direc = 4;//把方向從右到左改變為從上到上
            break;

        case 4:     //從下到上
            while (arr[i][j] == 0) //從下到上只需要判斷是否被正確賦值
            {
                arr[i][j] = num;
                i--; //j不變 i遞減
                num++;
            }
            i++; //改變索引為下一個變數的索引
            j++; //改變索引為下一個變數的索引
            direc = 1; //把方向從下到上改變為從左到右
            break;
        }
    }
}


原始碼下載地址如下: