问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
3 2
1 2
3 4
5 6
样例输出1 3 5 6 4 2
代码加注释:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n, m, i, j, sum;
int a[200][200];
scanf("%d %d", &n, &m);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
scanf("%d", &a[i][j]);
}
}
/* 输入 数据
* 3 3
* 1 2 3
* 4 5 6
* 7 8 9 */
int t = 0;//t为圈数
i= 0;//数的横坐标
j = 0;//数的纵坐标
sum = m * n;//总共要输出的数
while (sum)//sum 全部输出为 0 结束循环
{
while (i < n - t )// n i 为y轴
{//左上角向下走
if (i == 0 && j == 0)
{
printf("%d", a[0][0]);
i++;
}//输出第一个数 -- 1;
else printf(" %d", a[i++][j]);
sum--;
}
i--;//由于 i<n-t 例当输出为 3 *3 如第一圈i=3时 3<3跳出到这为 a[3][0] 需要-1到a[2][0]
j++;//第一圈时已经输出 a [2][0] 需要重a[2][1]开始
while (j < m - t ) // j 和 m 为x轴
{//向右走
printf(" %d", a[i][j++]);//第一圈 从a[2][1]到a[2][2]
sum--;
}//第一圈 最后为 a[2][3]
j--;//第一圈 需要-1 到 a[2][2]
i--;//第一圈 到 a [1][2]
while (i >= t )
{// 向上走
printf(" %d", a[i--][j]);// 第一圈 从a[1][2]到a[0][2]
sum--;
}
i++;
j--;
while (j >t )
{ //向左走
printf(" %d", a[i][j--]);
sum--;
}
j++;
i++;
t++;// 圈数加一
}
return 0;
}