试题 基础练习 回形取数

资源限制
时间限制:1.0s 内存限制:512.0MB


问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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


源代码如下:

#include<iostream>
#include<string>
using namespace std;
int  a[200][200];
int i = 0, j = 0;
int i_1 = 0, j_1 = 0;
void getdate(int m, int n)//m*n的矩阵
{
	for (int x = 0; x<m; x++)
		for (int y = 0; y < n; y++)
		{
			cin >> a[x][y];
		}
}
void show(int m, int n)//结果输出
{
	
	int b[200][200];
	int sum = 0;
							
	for (int x = 0; x < m; x++)	//对数组b的初始化。0代表对应位置上的数已被读取,1反之。	
		for (int y = 0; y < n; y++)//也可以用memset()来进行初始化,在string的头文件中。
			b[x][y] = 1;
	
	while (sum < m*n)
	{
		for (i; i < m - i_1; i++)//向下走
		{
			if (b[i][j] == 1 && b[i][j] > 0)
			{
				cout << a[i][j] << " ";
				b[i][j] = 0;
				sum++;
			}
		}

		for (j; j < n - j_1; j++)//向右走
		{
			if (b[i - 1][j] == 1 && b[i - 1][j] > 0)
			{
				cout << a[i - 1][j] << " ";
				b[i - 1][j] = 0;
				sum++;
			}
		}

		for (i = m - 2 - i_1; i >= 0+i_1; i--)//向上走
		{
			if (b[i][j - 1] == 1 && b[i][j - 1] > 0)
			{
				cout << a[i][j - 1] << " ";
				b[i][j - 1] = 0;
				sum++;
			}
		}

		for (j = n - 2 - j_1; j > 0; j--)//向左走
		{
			if (b[i + 1][j] == 1 && b[i + 1][j] > 0)
			{
				cout << a[i + 1][j] << " ";
				b[i + 1][j] = 0;
				sum++;
			}
		}
		i_1++; j_1++;
		i = i_1; j = j_1;
	}
	cout << endl;
}
int main()
{
	int m, n;
	cout << "请输入两个正整数,分别为行数,列数:" << endl;
	cin >> m >> n;
	getdate(m, n);
	show(m, n);
}

评测数据:(可自行复制验证)

  • 7 5
    2995 1945 4827 5436 2400
    4607 3902 153 292 2385
    7424 8719 9721 9898 5447
    1732 4774 1541 1869 9915
    5673 6305 7038 9894 8709
    3817 1331 342 7676 4664
    5144 7711 8259 6868 5553

    2995 4607 7424 1732 5673 3817 5144 7711 8259 6868 5553 4664 8709 9915 5447 2385 2400 5436 4827 1945 3902 8719 4774 6305 1331 342 7676 9894 1869 9898 292 153 9721 1541 7038


评测结果:

在这里插入图片描述


还请各位多多指教,谢啦。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值