题目描述
回形取数,是沿着一个数字矩阵的左上角向下开始移动取数,当前方向没有数字或者数字已经被取过,就会左转继续移动取数,当没有数可取时,取数结束。如下图所示:
回形取数结束后会产生一条线路图,也就是数字线路。上图的数字线路为:1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7
输入格式
输入包含两行,每行一个正整数, 2 ≤ n , m ≤ 20 2\le n,m\le20 2≤n,m≤20。 n n n表示数字矩阵的行数, m m m表示数字矩阵的列数。
输出格式
根据回形取数规则将最终的数字线路输出,数字线路中的每个数字之间需要有一个英文逗号隔开。
数字矩阵为从1开始的正整数,
输入样例
2
3
输出样例
1,4,5,6,3,2
样例解释
n n n行、 m m m列的数字矩阵中数字为从1开始的正整数,输入样例中的是2和3对应的数字矩阵为:
1 2 3
4 5 6
该矩阵对应的数字路线为:
1,4,5,6,3,2
#include <iostream>
using namespace std;
const int N = 50;
int g[N][N];
int main()
{
int n, m;
cin >> n >> m;
int t = 0;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
g[i][j] = ++ t;
int r = 1, c = 1;
cout << g[r][c];
g[r][c] = 0;
for(int i = 2; i <= n * m; i ++)
{
while(r + 1 <= n && g[r + 1][c])
{
cout << "," << g[++ r][c];
g[r][c] = 0;
}
while(c + 1 <= m && g[r][c + 1])
{
cout << "," << g[r][++ c];
g[r][c] = 0;
}
while(r - 1 >= 1 && g[r - 1][c])
{
cout << "," << g[-- r][c];
g[r][c] = 0;
}
while(c - 1 >= 1 && g[r][c - 1])
{
cout << "," << g[r][-- c];
g[r][c] = 0;
}
}
return 0;
}