5 回形取数
作者: Turbo时间限制: 1S章节: 基本练习(数组)
问题描述 :
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。 输入说明 :
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。 输出说明 :
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。 输入范例 : 4 3 1 2
3 4 5 6 7 8 9 10 11 12 输出范例 : 1 4 7 10 11 12 9 6 3 2 5 8
代码:
/*
T5 回形取数
算法概述:一圈一圈输出,每一圈分别按左下右上的顺序输出
*/
#include<stdio.h>
#define MAX_SIZE 205
int main() {
int layer = 0;// 表示当前处于矩阵的第几圈
int m = 4, n = 3;
int i = 0, j = 0;
int matrix[MAX_SIZE][MAX_SIZE];
scanf("%d%d", &m, &n);
for (i = 1; i <= m; i++) {
for (j = 1; j <= n; j++) {
scanf("%d", &matrix[i][j]);
}
}
i = 0, layer = 1;
while (i < m * n) {
for (j = layer; j <= m - layer + 1 && i < m * n; j++) {// 左
if (layer == 1 && j == 1)// 第一个输出,特殊处理
printf("%d", matrix[j][layer]);
else
printf(" %d", matrix[j][layer]);
i++;
}
for (j = layer + 1; j <= n - layer && i < m * n; j++) {// 下
printf(" %d", matrix[m - layer + 1][j]);
i++;
}
for (j = m - layer + 1; j >= layer && i < m * n; j--) {// 右
printf(" %d", matrix[j][n - layer + 1]);
i++;
}
for (j = m - layer; j >= layer + 1 && i < m * n; j--) {// 上
printf(" %d", matrix[layer][j]);
i++;
}
layer++;
}
return 0;
}