题目描述
现给出一个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的时候代表遍历完了。
最后也是通过了,但是估计有别的更好的方法,知道了之后再来补充吧!