【蓝桥杯】BASIC-25 回形取数
- 2019 年 11 月 13 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42449444/article/details/102981567
题目描述:
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
解题思路:
回形取数就是从第一行第一列开始按照“下右上左”的顺序进行输出。
AC代码:
#include <bits/stdc++.h> using namespace std; #define Up(i,a,b) for(int i = a; i <= b; i++) #define ms(a,x) memset(a,x,sizeof(a)) const int INF = 0x3f3f3f3f; const int maxn = 201; int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int a[maxn][maxn]; ms(a,INF); //初始化 int m,n; //m行n列 cin >> m >> n; Up(i,1,m) { Up(j,1,n) { cin >> a[i][j]; } } int i = 1, j = 1, cnt = 0; while(cnt < m*n) { while(i<=m && a[i][j]!=INF) //向下取数 { cout << (cnt==0?"":" ") << a[i][j]; a[i][j] = INF; //输出完置为INF i++; cnt++; } i--; j++; while(j<=n && a[i][j]!=INF) //向右取数 { cout << " " << a[i][j]; a[i][j] = INF; j++; cnt++; } i--; j--; while(i>=1 && a[i][j]!=INF) //向上取数 { cout << " " << a[i][j]; a[i][j] = INF; i--; cnt++; } i++; j--; while(j>=1 && a[i][j]!=INF) //向左取数 { cout << " " << a[i][j]; a[i][j] = INF; j--; cnt++; } i++; j++; } return 0; }