A43443. 回形取数回形取数是沿着一个数字矩阵的左上角向下开始移动取数当前方没有数字或者数字已经被取过就会左转继续移动取数当没有数可取时回形取数结束,如下图所示回形取数结束后会产生一条线路图,也就是数字线路。上路为:1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7
填空题
困难
知识点
题目描述
回形取数
回形取数是沿着一个数字矩阵的左上角向下开始移动取数当前方没有数字或者数字已经被取过就会左转继续移动取数当没有数可取时回形取数结束,如下图所示

回形取数结束后会产生一条线路图,也就是数字线路。
上路为:1,5,9,13,14,15,16,12,8,4,3,2,6,10,11,7
题目描述:
用户分行输入两个正整数(2<=正整数<=20),第一个数代表数字矩阵的行数,第二个数代表数字矩阵的列数,数字矩阵的数字为从1开始的正整数,根据回形取数规则将最终的数字线路输出(数字线路中的每个数字之间需要有一个英文逗号隔开)。
例如:
输入的是2和3数字矩阵为:
1 2 3
4 5 6
数字线路为:1,4,5,6,3,2
输入的是4和3数字矩阵为:
1 2 3
4 5 6
7 8 9
10 11 12
数字线路为:1,4,7,10,11,12,9,6,3,2,5,8
注:数字矩阵不需要输入此处只为展示
输入描述
第一行输入一个正整数作为行数
第二行输入一个正整数作为列数
编出描述
根据回形取数规则将数字线路输出(数字线路中的每数字之间需要有一个英文逗号隔开)
样例输入
3
2
样例输出
1,3,5,6,4,2
参考答案
#include <iostream>
#include <cstdio>
using namespace std;
int v[105][105],a[105][105];
int main()
{
int n,m,k=0;
int i,j;
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++) a[i][j]=++k;
i=k=1;j=0;
cout<<a[0][0];
v[0][0]=1;
while(k<n*m){
while (i<n && v[i][j]==0){
cout<<","<<a[i][j];
v[i][j]=1;i++;k++;
}
i--;j++;
while(j<m && v[i][j]==0){
cout<<","<<a[i][j];
v[i][j]=1;
j++;k++;
}
i--;j--;
while (i>=0&&v[i][j]==0){
cout<<","<<a[i][j];
v[i][j]=1;
i--;k++;
}
i++;j--;
while(j>=0 && v[i][j]==0){
cout<<","<<a[i][j];
v[i][j]=1;
j--;k++;
}
i++;j++;
}
return 0;
}答案解析
评分标准:
20分:能正确输出一组数据;
20分:能正确输出两组数据;
20分:能正确输出三组数据;
上一题
下一题