资源限制
内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
题目分析
要求以“回”字的形式取数,先取左边第一行,然后依次是下一,右一,最后是上一。一轮取数结束后,往里缩一圈,重复上述操作,直至数组里的数全部被取出来。如下图:
需要注意的是,在进行循环打印的时候需要注意限制条件,得是(left<=right)&&(top<=bottom)的时候才可以进行循环打印,没有限制条件可能会导致被访问过的元素被再次访问而出错。同时,在打印右一和上一时,要设置好边界,避免重复和不必要的操作,以提高程序的效率。
left!=right和top!=bottom是保证当循环到某层时,如果只有一行,就不用进行打印“右一”的操作。同理,当只有一列的时候,就不用进行打印“上一”的操作。
核心代码
while(left<=right&&top<=bottom) //循环条件
{
//左一
for(int k=top;k<=bottom;k++)
{
cout<<a[k][left]<<" ";
}
//下一
for(int k=left+1;k<=right;k++)
{
cout<<a[bottom][k]<<" ";
}
//右一
if(right!=left)
{
for(int k=bottom-1;k>=top;k--)
{
cout<<a[k][right]<<" ";
}
}
//上一
if(top!=bottom)
{
for(int k=right-1;k>=left+1;k--)
{
cout<<a[top][k]<<" ";
}
}
left++;right--;top++;bottom--; //往里缩一圈
}
完整代码
#include<iostream>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
int a[m][n];
int num=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
int left=0,top=0,bottom=m-1,right=n-1; //边界
while(left<=right&&top<=bottom) //循环条件
{
//左一
for(int k=top;k<=bottom;k++)
{
cout<<a[k][left]<<" ";
}
//下一
for(int k=left+1;k<=right;k++)
{
cout<<a[bottom][k]<<" ";
}
//右一
if(right!=left)
{
for(int k=bottom-1;k>=top;k--)
{
cout<<a[k][right]<<" ";
}
}
//上一
if(top!=bottom)
{
for(int k=right-1;k>=left+1;k--)
{
cout<<a[top][k]<<" ";
}
}
left++;right--;top++;bottom--; //往里缩一圈
}
return 0;
}