逆序與蛇形輸出矩陣

逆序與蛇形輸出矩陣

逆序

輸入n,得到n*n矩陣,逆時針輸出各項元素值,並空格隔開。
例,n=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。

分析

首先,這是一個邊界問題,從裏到外,我們可以理解爲運動問題,即從Matrix[0][0],環繞矩陣外圍一直運動到矩陣內部。
我們可以定義4個方向,即0/1/2/3(右,下,左,上)。再定義Mark[n][n]=1,每當輸出一個數值時,便另Mark[n][n]=0
通過判斷邊界調整方向。

代碼塊

int matrix[N][N];
int mark[N][N];
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int t=1;
        int i;
        //初始化
        for(i=0;i<n;i++){
            for(int j=0;j<n;j++){
                matrix[i][j]=(t++);
            }
        }
        for(i=0;i<n;i++){
            for(int j=0;j<n;j++){
                mark[i][j]=1;
            }
        }
        printf("\n");
        int count=n*n;
        int go=0,x=0,y=0;
        while(count--){
            switch(go){
                case 0:     //右
                    printf("%d ",matrix[x][y]);
                    mark[x][y]=0;
                    if(mark[x][y+1]==0){
                       go=1;
                        x++;
                    }else{
                        y++;
                    }
                    break;
                case 1:     //下
                    printf("%d ",matrix[x][y]);
                    mark[x][y]=0;
                    if(mark[x+1][y]==0){
                        go=2;
                        y--;
                    }else{
                        x++;
                    }
                    break;
                case 2:     //左
                    printf("%d ",matrix[x][y]);
                    mark[x][y]=0;
                    if(mark[x][y-1]==0){
                        go=3;
                        x--;
                    }else{
                        y--;
                    }
                    break;
                case 3:     //上
                    printf("%d ",matrix[x][y]);
                    mark[x][y]=0;
                    if(mark[x-1][y]==0){
                        go=0;
                        y++;
                    }else{
                        x--;
                    }
                    break;
            }
        }
        printf("\n");

    }
    return 0;
}

蛇形

輸入n,得到n*n矩陣,蛇形輸出各項元素值,並空格隔開。
例,n=4,矩陣就是
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
輸出的內容就是:1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16

分析

這也是一題邊界問題,該矩陣輸出有4個方向,即0/1/2/3(右,左下,下,右上),每當到達邊界,只需判斷下一步大方向即可。

代碼塊

int count=n*n-1;
        int go=0,x=0,y=0;
        printf("%d ",matrix[x][y]);
        mark[x][y]=0;
        while(count--){
            switch(go){
                case 0:     //右
                y++;
                printf("%d ",matrix[x][y]);
                mark[x][y]=0;
                if(x==0){
                    go=1;
                }else if(x==n-1){
                    go=3;
                }
                break;

            case 1:     //左下
                if(x<n-1 && y>0){
                    x++;
                    y--;
                }
                printf("%d ",matrix[x][y]);
                if(y==0 && x==n-1){
                    go=0;
                }else if(y==0){
                    go=2;
                }else if(x==n-1){
                    go=0;
                }
                break;

            case 2:     //下
                x++;
                printf("%d ",matrix[x][y]);
                mark[x][y]=0;
                if(y==0 || x==n-1){
                    go=3;
                }else if(y==n-1){
                    go=1;
                }
                break;

            case 3:     //右上
                if(x>0 && y<n-1){
                    x--;
                    y++;
                }
                printf("%d ",matrix[x][y]);
                mark[x][y]=0;
                if(y==n-1 && x==0){
                    go=2;
                }else if(y==n-1){
                    go=2;
                }else if(x==0){
                    go=0;
                }
                break;

            }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章