劍指OFFER之順時針打印矩陣(九度OJ1391)


題目描述:

輸入一個矩陣,按照從外向里以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣:

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

 

輸入:

輸入可能包含多個測試樣例,對於每個測試案例,

輸入的第一行包括兩個整數m和n(1<=m,n<=1000):表示矩陣的維數為m行n列。

接下來的m行,每行包括n個整數,表示矩陣的元素,其中每個元素a的取值范圍為(1<=a<=10000)。

 

輸出:

對應每個測試案例,輸出一行,

按照從外向里以順時針的順序依次打印出每一個數字,每個數字后面都有一個空格。

 

樣例輸入:
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
樣例輸出:
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 

解題思路:

  這道題目有一個坑人的地方,但是題目中已經說明了,就是每個數字后面都有一個空格,因此,最后一個數字也是有空格的

  主要的思想是:采用一層一層的剝離輸出。我們標記好每次行threshold_m與列threshold_n的范圍,然后通過指定輸出的頂點,來調用輸出函數。

     threshold_n = n;
        threshold_m = m;
        i=0;
        j=0;
        while(i<threshold_m && j < threshold_n){
            printMatrix(i,j);
            i++;
            j++;
            threshold_n--;
            threshold_m--;
        }

 

void printMatrix(int m,int n){
    int i=m,j=n;
    for( ;j<threshold_n;j++){
        printf("%d ",arr[i][j]);
    }
    j--;
    for(i++;i<threshold_m;i++){
        printf("%d ",arr[i][j]);
    }
    i--;
    for(j--;j>=n && i!=m;j--){
        printf("%d ",arr[i][j]);
    }
    j++;
    for(i--;i>m && j!=threshold_n-1;i--){
        printf("%d ",arr[i][j]);
    }
}

 

全部代碼:

#include <stdio.h>
#define MAXSIZE 1000
int arr[MAXSIZE][MAXSIZE] = {0};
int threshold_m = 0;
int threshold_n = 0;
void printMatrix(int m,int n);
    
int main(){
    int m,n,i,j;
    while(scanf("%d %d",&m,&n) != EOF  && n>=1 && n<=1000 && m>=1 && m<=1000){
   
        for(i=0;    i<m; i++){
            for(j=0;    j<n; j++)
                scanf("%d",&arr[i][j]);
        }
        threshold_n = n;
        threshold_m = m;
        i=0;
        j=0;
        while(i<threshold_m && j < threshold_n){
            printMatrix(i,j);
            i++;
            j++;
            threshold_n--;
            threshold_m--;
        }
        printf("\n");
    }
    return 0;
}
void printMatrix(int m,int n){
    int i=m,j=n;
    for( ;j<threshold_n;j++){
        printf("%d ",arr[i][j]);
    }
    j--;
    for(i++;i<threshold_m;i++){
        printf("%d ",arr[i][j]);
    }
    i--;
    for(j--;j>=n && i!=m;j--){
        printf("%d ",arr[i][j]);
    }
    j++;
    for(i--;i>m && j!=threshold_n-1;i--){
        printf("%d ",arr[i][j]);
    }
}
/**************************************************************
    Problem: 1391
    User: xhalo
    Language: C
    Result: Accepted
    Time:560 ms
    Memory:4820 kb
****************************************************************/

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM