顺时针打印数字矩阵

时间限制:1秒

空间限制:32768K

给定一个数字矩阵,请设计一个算法从左上角开始顺时针打印矩阵元素

输入描述:
输入第一行是两个数字,分别代表行数M和列数N;接下来是M行,每行N个数字,表示这个矩阵的所有元素;当读到M=-1,N=-1时,输入终止。

输出描述:
请按逗号分割顺时针打印矩阵元素(注意最后一个元素末尾不要有逗号!例如输出“1,2,3”,而不是“1,2,
3,”),每个矩阵输出完成后记得换行

输入例子1:
3 3
1 2 3
4 5 6
7 8 9
-1 -1

输出例子1:
1,2,3,6,9,8,7,4,5

# include <iostream>
# include <stdio.h>
using namespace std;


int main(){
    int m,n;
    while (scanf("%d%d",&m,&n) != EOF) {
        if (m == -1) {
            break;
        }
        int a[m][n];
        for (int i=0; i<m; i++) {
            for (int j=0; j<n; j++) {
                scanf("%d",&a[i][j]);
            }
        }
        //
        int i=0,j=0;
        int status = 3;//up:0;down:1;left:2;right:3
        int u=0,d=0,l=0,r=0;//分别代表它们走的次数
        int count=0;
        
        while (count < m*n) {
            if (status == 0) {//up
                while (i >= r) {
                    count++;
                    if (count == m*n) {
                        printf("%d\n",a[i][j]);
                        break;
                    }
                    printf("%d,",a[i][j]);
                    i--;
                }
                i++;
                status = 3;//turn right
                u++;
                j++;//从4变成5
            }else if (status == 1){//down
                while (i < m-l) {
                    count++;
                    if (count == m*n) {
                        printf("%d\n",a[i][j]);
                        break;
                    }
                    printf("%d,",a[i][j]);
                    i++;
                }
                i--;
                status = 2;//turn left
                d++;
                j--;//从9变成8
            }else if (status == 2){//left
                while (j >= u) {
                    count++;
                    if (count == m*n) {
                        printf("%d\n",a[i][j]);
                        break;
                    }
                    printf("%d,",a[i][j]);
                    j--;
                }
                j++;
                status = 0;//turn up
                l++;
                i--;//从7变成4
            }else{//right
                while (j < n-d) {
                    count++;
                    if (count == m*n) {
                        printf("%d\n",a[i][j]);
                        break;
                    }
                    printf("%d,",a[i][j]);
                    j++;
                }
                j--;
                status = 1;//turn down
                r++;
                i++;//从3变成6
            }
        }
        
    }
    return  0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值