前言
本篇文章主要分享自己写的一个c语言的矩阵螺旋输出思路和代码,希望能对大家有所帮助。
一、思路
- 首先是输入部分,我们新建一个二维数组matrix[m][n],并循环读入数据,读入数据的总数为m * n,注意为了方便理解,我从1开始计数而非0,即最后一个数据下表为m * n而不是m * n - 1。
- 然后进入输出部分,输出部分是一个嵌套4个小循环的大循环,可以分为4个小部分分别是向右、向下、向左、向上输出。每经历一次大循环,则代表经历过4个小循环的标志flag都会被清零,当输出至最后一个数据时,当前位置的下一个小循环就不会进行,flag仍为0,则break跳出循环,程序结束。
- 向右输出。循环限制条件是小于列的最大数n,当整个向右循环结束后,n要减1,代表最大列数减1。且当前行下标加1,代表当前位置垂直向下移动1。
- 向下输出。循环限制条件是小于行的最大数m,当整个向下循环结束后,m要减1,代表最大行数减1。且当前列下标减1,代表当前位置垂直向左移动1。
- 向左输出。循环限制条件是大于左限(limit_left),当整个向左循环结束后,limit_left要加1,代表左限加1,注意初始左限为0。且当前列下标减1,代表当前位置垂直向左移动1。
- 向上输出。循环限制条件是大于上限(limit_up),当整个向上循环结束后,limit_up要加1,代表上限加1。注意初始上限为1。且当前行下标加1,代表当前位置垂直向上移动1。
- 输出部分还有些小细节需要注意如由于for循环会多加减一次要注意恢复,输出最后一个数据注意后面不能有空格。
- ⭐代表每次向右、向下、向左、向上输出循环结束后,当前位置下标移动后的位置,也就是下个循环开始的位置。
二、代码
#include <stdio.h>
#include <string.h>
int main() {
int matrix[100][100] = {0};
int m = 0, n = 0, temp = 0;
int count_1 = 0, count_2 = 0;
int limit_up = 1,limit_left = 0;
int flag_1,flag_2,flag_3,flag_4;
int i, j;
scanf("%d %d",&m,&n);//输入行和列数
count_2 = m * n;//最大执行次数
for(i = 1; i <= m; i++)//输入数据
{
for(j = 1; j <= n; j++)
{
scanf("%d",&matrix[i][j]);
}
}
i = 1;//注意返回一
j = 1;//注意返回一
while(1)
{
flag_1 = 0;
flag_2 = 0;
flag_3 = 0;
flag_4 = 0;
for(; j <= n; j++)//向右输出
{
flag_1 = 1;//当经过此循环,flag变1,提示程序还要继续
count_1++;//每输出一个数计数加一
if(count_1 == count_2)//当总计数到达最大值(行乘列就是最大值),代表程序结束
printf("%d",matrix[i][j]);
else
printf("%d ",matrix[i][j]);
}
if(flag_1 == 0)//程序结束
{
break;
}
i++;//当前位置垂直向下移动一
j--;//多加一次,要注意减去
n = n - 1;//列的最大值要减一
for( ; i <= m; i++)//向下输出
{
flag_2 = 1;
count_1++;
if(count_1 == count_2)
printf("%d",matrix[i][j]);
else
printf("%d ",matrix[i][j]);
}
if(flag_2 == 0)
{
break;
}
i--;//多加一次,要注意减去
j--;//当前位置向左移动一
m = m - 1;//行的最大值减一
for( ; j > limit_left; j--)//向左输出
{
flag_3 = 1;
count_1++;
if(count_1 == count_2)
printf("%d",matrix[i][j]);
else
printf("%d ",matrix[i][j]);
}
if(flag_3 == 0)
{
break;
}
j++;//多减一次,要注意加一
i--;//当前位置向上移动一
limit_up++;//上限加一
for( ; i >= limit_up ; i--)//向上输出
{
flag_4 = 1;
count_1++;
if(count_1 == count_2)
printf("%d",matrix[i][j]);
else
printf("%d ",matrix[i][j]);
}
if(flag_4 == 0)
{
break;
}
i++;//多减一次,要注意加一
j++;//当前位置向右移动一
limit_left++;//左限加一
}
return 0;
}
总结
第一次分享自己的想法,希望能给大家带来帮助。如果大家有什么意见建议也欢迎留言讨论。