资源限制
内存限制: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
注:题目来自蓝桥杯练习系统
题解:可用while循环进行模拟取数过程
代码:
#include<iostream>
using namespace std;
const int N = 200;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)//IOS 提升cin cout 速度
int a[N + 1][N + 1];
void hxqs(int m, int n)
{
int s = m * n;//总共需输出的数的个数
int i = 0, j = 0, cnt = 0;//初始位置(i,j)以及已经输出的数的个数
int k = 0;//回形取数,每次范围缩小一圈
while(1)
{
while(i < m - k)//j不动,i增加到最底行进行输出
{
cout << a[i][j] << " ";
cnt++;
if(cnt == s) return ;
i++;
}
i--;j++;//i超出范围,回退一格,j往右走一格,以下三个i,j变化同理
while(j < n - k)//i不动,j增加到最右边行进行输出
{
cout << a[i][j] << " ";
cnt++;
if(cnt == s) return ;
j++;
}
j--;i--;
while(i >= k)//j不动,i减少到最左边行进行输出
{
cout << a[i][j] << " ";
cnt++;
if(cnt == s) return ;
i--;
}
i++;j--;
while(j > k)//i不动,因左上角的数已经输出过,j减少到左边还未输出行进行输出
{
cout << a[i][j] << " ";
cnt++;
if(cnt == s) return ;
j--;
}
j++;i++;
k++;//如果没有取完数,则对k进行自增,用于将取数范围缩小一圈
}
}
int main()
{
IOS;
int r, c;
cin >> r >> c;
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
cin >> a[i][j];
}
}
hxqs(r, c);
return 0;
}