逆序与蛇形输出矩阵

逆序与蛇形输出矩阵

逆序

输入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;

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