c++作业(四):矩阵运算

题目描述

现给出一个m行n列的矩阵(m和n均不大于10),其中每个元素均为30以内的正整数,要求按照蛇形和回转两种方式将矩阵的元素进行输出,两种方式如下。 假设矩阵为

1 2 3 4
5 6 7 8
9 10 11 12

那么,它的 蛇形输出为从左上角元素开始横向探索,第一行正序,第二行返回来倒序,第三行再正序,以此类推:

1 2 3 4 8 7 6 5 9 10 11 12

它的回转输出为从左上角元素开始,向右探索,到尽头以后向下,到尽头以后向左,到尽头以后再向上,以此类推:

1 2 3 4 8 12 11 10 9 5 6 7 8

第一行是两个数m和n,分别代表矩阵的行数和列数。 第二行开始输入对应矩阵。

第一行输出蛇形输出。 第二行输出回转输出。 相邻的两个整数之间用一个空格分开,行尾无空格。

输入输出

5 6
4 8 9 4 5 6
1 2 5 6 8 5
2 9 8 7 5 4
2 3 5 7 8 9
9 8 6 2 7 8

4 8 9 4 5 6 5 8 6 5 2 1 2 9 8 7 5 4 9 8 7 5 3 2 9 8 6 2 7 8
4 8 9 4 5 6 5 4 9 8 7 2 6 8 9 2 2 1 2 5 6 8 5 8 7 5 3 9 8 7

我的代码 

#include<iostream>
using namespace std;
void snake(int arr[10][10], int m, int n)//这里是一个我不会的点,二维数组如何当函数参数!
{
	for (int i = 0;i < m;i++)
	{
		if (i % 2 == 0)//说明是奇数行
		{
			for (int j = 0;j < n;j++)
			{
				cout << arr[i][j] << ' ';
			}
		}
		else
		{
			for (int j = n-1;j >=0;j--)
			{
				cout << arr[i][j] << ' ';
			}
		}
	}
	cout << endl;
}
void huizhuan(int arr[10][10], int m, int n)
{
	int c = 0;
	int i = 0;
	int j = 0;
	int num = 0;
	while (1)
	{

		if (c % 4 == 0)
		{
			while (j < n - (c + 1) / 4)
			{
				cout << arr[i][j] << ' ';
				j++;
				num++;
			}
			c++;
			i++;
			j--;//因为最后依次循环j++了
		}
		else if (c % 4 == 1)
		{
			while (i < m - (c + 1) / 4)
			{
				cout << arr[i][j] << ' ';
				i++;
				num++;
			}
			c++;
			j--;
			i--;
		}
		else if (c % 4 == 2)
		{
			while (j >= 0 + (c + 1) / 4)
			{
				cout << arr[i][j] << ' ';
				j--;
				num++;
			}
			c++;
			i--;
			j++;
		}
		else if (c % 4 == 3)
		{
			while (i >= 0 + (c + 1) / 4)
			{
				cout << arr[i][j] << ' ';
				i--;
				num++;
			}
			c++;
			j++;
			i++;

		}
		if (num==n*m)
		{
			break;
		}
		
	}
}
int main()
{
	int m;//行数
	int n;//列数
	int arr[10][10];
	cin >> m >> n;
	for (int i = 0;i < m;i++)
	{
		for (int j= 0;j < n;j++)
		{
			cin >> arr[i][j];
		}
	}
	snake(arr, m, n);
	huizhuan(arr, m, n);
}

TIPS:

①通过这题,我知道了原来二维数组传参不可以直接传arr,而需要arr[10][10]这样传,可能是涉及到一些指针的问题。之前写一维数组的时候,就可以直接用arr来传。

②蛇型输出比较简单。只要分奇数行和偶数行就可以了。

③回转输出对我来说写了很久。

1.我不明白要怎么区分每次的逻辑运算。因此我写的比较复杂,用了一个计数c,用它除以4的模来设置每次循环的终点。

2.用while循环,每输出一次加了一个1,导致每次会多加一个1,所以要把它减掉,防止数组溢出。

3.一开始将break写在了while(1)中的每个while里面,这样导致无法结束外层的死循环。所以还是要写在外面。由于我不会确定终止时元素的i、j值,所以我很笨地用了一个计数器num,等到num等于n*m的时候代表遍历完了。

最后也是通过了,但是估计有别的更好的方法,知道了之后再来补充吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值