程序填空题:螺旋输出二维数组
做过了很多简单题,是不是不过瘾啊,那咱们来一个稍微有点难度的题吧。
给定一个m行、n列的二维数组,请按照顺时针螺旋的顺序输出数组中所有的元素(从[0][0]位置开始,如下图所示)

### 输入格式:
首先在第一行输入2个整数,分别对应题目描述中的m和n(1<=m,n<=100),之间用一个空格分隔。
接下来输入m 行,每行包括n个整数,每两个整数之间用一个空格分隔。
### 输出格式:
输出为一行,包括m*n个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。
### 输入样例1:
4 3
1 2 3
10 11 4
9 12 5
8 7 6
### 输出样例1:
1 2 3 4 5 6 7 8 9 10 11 12
### 输入样例2:
3 4
1 2 3 4
10 11 12 5
9 8 7 6
### 输出样例2:
1 2 3 4 5 6 7 8 9 10 11 12
有的小伙伴可能会说,这不难呀,一圈圈的输出就是了。
那要输出几圈呢?可以根据上面的样例看看需要输出几圈。
不知道同学们找到规律了没有?没找到规律的同学,请查阅给出的代码。
那输出每一圈又怎么做呢?是不是先输出上边,然后右边,再下边,最后左边。那这四条边分别要怎么处理呢?请同学们开动脑筋,自己去发现吧。
偷偷说一声,注意内圈别重复输出了。
c++
#include <stdio.h>
int main() {
int matrix[100][100];
int m;
int n;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&matrix[i][j]);
int temp[10000];int l=0;
int j;
if(m>n) j=(n+1)/2;else j=(m+1)/2;
int left=0,right=n-1,up=0,buttom=m-1;
for(int i=0;i<j;i++)//大循环,从外向内逐层遍历矩阵
{
for(int k=left;;k++)//从左往右遍历“上边”
{
temp[l++]=matrix[up][k];
}
for(int k=up+1;;k++)//从上到下遍历“右边”
{
temp[l++]=matrix[k][right];
}
for(int k=right-1;;k--)//从右到左遍历“下边”
{
temp[l++]=matrix[][k];
}
for(int k=buttom-1;;k--)//从下到上遍历“左边”
{
temp[l++]=matrix[k][left];
}
left++;up++;right--;buttom--;
}
printf("%d",temp[0]);//单独输出第一个元素
for(int i=1;i<l;i++)//输出剩余元素
{
printf(" %d",temp[i]);
}
return 0;
}
答案:
第1空:k<=right
第2空:k<=buttom
第3空:up<buttom&&k>=left
第4空:buttom
第5空:left<right&&k>up
给定一个m行、n列的二维数组,请按照顺时针螺旋的顺序输出数组中所有的元素(从[0][0]位置开始,如下图所示)

### 输入格式:
首先在第一行输入2个整数,分别对应题目描述中的m和n(1<=m,n<=100),之间用一个空格分隔。
接下来输入m 行,每行包括n个整数,每两个整数之间用一个空格分隔。
### 输出格式:
输出为一行,包括m*n个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。
### 输入样例1:
4 3
1 2 3
10 11 4
9 12 5
8 7 6
### 输出样例1:
1 2 3 4 5 6 7 8 9 10 11 12
### 输入样例2:
3 4
1 2 3 4
10 11 12 5
9 8 7 6
### 输出样例2:
1 2 3 4 5 6 7 8 9 10 11 12
有的小伙伴可能会说,这不难呀,一圈圈的输出就是了。
那要输出几圈呢?可以根据上面的样例看看需要输出几圈。
不知道同学们找到规律了没有?没找到规律的同学,请查阅给出的代码。
那输出每一圈又怎么做呢?是不是先输出上边,然后右边,再下边,最后左边。那这四条边分别要怎么处理呢?请同学们开动脑筋,自己去发现吧。
偷偷说一声,注意内圈别重复输出了。
c++
#include <stdio.h>
int main() {
int matrix[100][100];
int m;
int n;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&matrix[i][j]);
int temp[10000];int l=0;
int j;
if(m>n) j=(n+1)/2;else j=(m+1)/2;
int left=0,right=n-1,up=0,buttom=m-1;
for(int i=0;i<j;i++)//大循环,从外向内逐层遍历矩阵
{
for(int k=left;;k++)//从左往右遍历“上边”
{
temp[l++]=matrix[up][k];
}
for(int k=up+1;;k++)//从上到下遍历“右边”
{
temp[l++]=matrix[k][right];
}
for(int k=right-1;;k--)//从右到左遍历“下边”
{
temp[l++]=matrix[][k];
}
for(int k=buttom-1;;k--)//从下到上遍历“左边”
{
temp[l++]=matrix[k][left];
}
left++;up++;right--;buttom--;
}
printf("%d",temp[0]);//单独输出第一个元素
for(int i=1;i<l;i++)//输出剩余元素
{
printf(" %d",temp[i]);
}
return 0;
}
答案:
第1空:k<=right
第2空:k<=buttom
第3空:up<buttom&&k>=left
第4空:buttom
第5空:left<right&&k>up