C/CPP基础练习题多维数组,矩阵转置,杨辉三角详解

简介: C/CPP基础练习题多维数组,矩阵转置,杨辉三角详解

多维数组

1. 矩阵转置

输入一个数字构成的矩形, 将矩形的值进行转置后打印

输入:

第一行 正整数n(1<n<10), 表示矩阵的边长

随后输入一个矩阵

输出:

转置后的矩阵

样例输入:

3

1 2 3

4 5 6

7 8 9

样例输出:

1 4 7

2 5 8

3 6 9

2. 颈椎病治疗

最近云海学长一直对着电脑改bug, 颈椎不舒服, 希望各位小伙伴帮云海学长治治

提供一张图片, 将图片旋转后再发给云海学长, 这样学长看图的时候就需要歪着脖子, 时间久了, 颈椎病就治好了

输入一个数字构成的矩形, 将矩形的值进行90度旋转后打印

输入:

第一行 正整数n(1<n<10), 表示矩阵的边长

随后输入一个矩阵

输出:

90度旋转后的矩阵

样例输入:

3

1 2 3

4 5 6

7 8 9

样例输出:

7 4 1

8 5 2

9 6 3

3. 杨辉三角

输入n(1<n<10), 打印高度为n的杨辉三角

样例输入: 5

样例输出:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

*4. 包围圈

东东哥在一场军事演练中, 需要对一片正方形森林进行排查,

为了防止被包围, 东东哥需要先排查外围才能进一步深入

输入: 正整数n(1<n<10),  表示森林的边长

输出: 东东哥排查森林的顺序

样例输入:

4

样例输出:

1   2   3   4

12 13 14  5

11 16 15  6

10   9  8   7

解答

1.矩阵转置

#include<iostream>

usingnamespacestd;

constintN=10;

//按数字顺序生成二维数组

voidFuZhi(intn,inta[][10])

{

   intk=0;

   for (inti=0; i<n; i++)

   {

       for (intj=0; j<n; j++)

       {

           k++;

           a[i][j] =k;

       }

   }

}

//转置,行和列互换

voidZhuanZ(intn,inta[][N])

{

   for (inti=0; i<n; i++)

   {

       for (intj=0; j<n; j++)

       {

           if (i>j)

           {

               intt=a[i][j];

               a[i][j] =a[j][i];

               a[j][i] =t;

           }

       }

   }

}

//打印

voidPrint(intn,inta[][10])

{

   for (inti=0; i<n; i++)

   {

       for (intj=0; j<n; j++)

       {

           cout<<a[i][j];

       }

       cout<<endl;

   }

}

intmain()

{

   intn; cin>>n;

   if (n>1&&n<=N)

   {

       inta[N][N];

       

       FuZhi(n, a);

       Print(n, a);

       cout<<"转置后:"<<endl;

       ZhuanZ(n, a);

       Print(n, a);

   }

   system("pause"); return0;

}

// 矩阵转置

voidDemo61() {

   //--变量声明--

   // 矩阵边长, 矩阵本身, 转置后数组

   intsize, arr[10][10], result[10][10];

   //--接收输入--

   scanf_s("%d", &size);

   for (inti=0; i<size; i++) {

       for (intj=0; j<size; j++) {

           scanf_s("%d", &arr[i][j]);

       }

   }

   //--数据处理--

   for (inti=0; i<size; i++) {

       for (intj=0; j<size; j++) {

           result[j][i] =arr[i][j];

       }

   }

   //--输出--

   for (inti=0; i<size; i++) {

       for (intj=0; j<size; j++) {

           printf("%d ", result[i][j]);

       }

       printf("\n");

   }

}

✨2.矩阵90°转置

// 颈椎病

voidDemo62() {

   //--变量声明--

   // 矩阵边长, 矩阵本身, 转置后数组

   intsize, arr[10][10], result[10][10];

   //--接收输入--

   scanf_s("%d", &size);

   for (inti=0; i<size; i++) {

       for (intj=0; j<size; j++) {

           scanf_s("%d", &arr[i][j]);

       }

   }

   //--数据处理--

   for (inti=0; i<size; i++) {

       for (intj=0; j<size; j++) {

           result[j][size-i-1] =arr[i][j];

       }

   }

   //--输出--

   for (inti=0; i<size; i++) {

       for (intj=0; j<size; j++) {

           printf("%d ", result[i][j]);

       }

       printf("\n");

   }

}

详细分析:

//数组下标变化:

   

   假设size为3

     012                    

   0123

   1456      

   2789

   ->

     012

   0741

   1852    

   2963

       

x1y    y  x2

[0][0]->[0][2]

[0][1]->[1][2]

[1][2]->[2][1]

[2][1]->[1][0]

   

//规律:

x转y,y转x

x转y时size-x=y,由于下标开始值为0,所以size-1-x=y

y转x时y=x

如上,y下标原封替换x坐标,但是x下标需要被size-1减后才能作为新数组的y下标。

3.杨辉三角

#include<iostream>

usingnamespacestd;

voidPrint(intn, inta[][10]);

voidYH(intn)

{

   inta[10][10];

   //计算杨辉三角, 以下三角矩阵的形式存放在二维数组

   for (inti=0; i<n; i++) {

       a[i][0] =1;

       a[i][i] =1;

       for (intj=1; j<i; j++)

           a[i][j] =a[i-1][j-1] +a[i-1][j];    //i不可能取值为0导致地址越界

   }

   Print(n,a);

}

voidPrint(intn,inta[][10])

{

   for (inti=0; i<n; i++) {

       for (intj=1; j<=n-1-i; j++)        //打印每行开始的空格

           cout<<" ";

       for (intj=0; j<=i; j++)            //每行打印的数据个数

           cout<<a[i][j] <<" ";

       cout<<endl;

   }

}

intmain() {

   intn; cin>>n;

   YH(n);

   system("pause"); return0;

}

// 杨辉三角

voidDemo63() {

   //--变量声明--

   // 杨辉三角的高度

   intn;

   // 存储用数组,  注意杨辉三角只会占用一半的空间, 所以这里可以用malloc动态分配来避免空间浪费

   intarr[10][10];

   

   //--接收输入--

   scanf_s("%d", &n);

   arr[0][0] =1;

   //--数据处理--

   // 左右两侧数据直接填充即可

   for (inti=1; i<n; i++) {

       arr[i][0] =arr[i][i] =1;

       for (intj=1; j<i; j++) {

           arr[i][j] =arr[i-1][j-1] +arr[i-1][j];

       }

   }

   //--输出--

   for (inti=0; i<n; i++) {

       for (intj=0; j<=i; j++) {

           printf("%d ", arr[i][j]);

       }

       printf("\n");

   }

}

✨4.包围圈

// 包围圈

voidDemo64() {

   //--变量声明--

   intsize, tree[10][10];

   // 当前坐标xy, 移动方向toward 0左 1下 2右 3上, 填充数

   // 注意 由于第一次探查前会先移动 x++  所以x需要修正为-1

   intx=-1, y=0, toward=0, num=0;

   // 一个方向的移动步数

   ints;

   //--接收输入--

   scanf_s("%d", &size);

   s=size;

   //--数据处理--

   // 移动规律  如果是4  则是4+3+3+2+2+1+1 = 16  同理 如果是5  5+4+4+3+3+2+2+1+1

   // 外部循环: 每奇数次循环,  最大步数-1.  一个方向移动完后 对方向进行修改

   // 内部循环: 循环(步数)次, 每次移动根据方向对xy进行修改

   for (inti=0; num<size*size; i++) {

       // 奇数次循环 最大步数-1

       if (i%2==1) s--;

       for (intj=0; j<s; j++) {

           // 获取方向并移动

           switch (toward) {

           case0:

               x++;

               break;

           case1:

               y++;

               break;

           case2:

               x--;

               break;

           case3:

               y--;

               break;

           }

           

           tree[y][x] =++num;

       }

       //  改变方向  注意 当toward为3  也就是向上时, 需要取模操作 也就是变为0

       // (1+1) %4 = 2   (3+1) %4=0

       toward= (toward+1) %4;

   }

   //--输出--

   for (inti=0; i<size; i++) {

       for (intj=0; j<size; j++) {

           printf("%d ", tree[i][j]);

       }

       printf("\n");

   }

}


目录
相关文章
|
传感器 算法 C语言
C语言基础算法---从数组中找最大最小值的实际应用
C语言基础算法---从数组中找最大最小值的实际应用
98 0
|
2月前
|
存储 编译器 C语言
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
|
7月前
|
C语言
C语言期末习题之二维数组转置
C语言期末习题之二维数组转置
62 0
|
6月前
|
C语言
C语言--矩阵转置
C语言--矩阵转置
|
7月前
|
存储 人工智能 算法
C语言实现矩阵转置
C语言实现矩阵转置
618 0
|
C语言
C语言-利用指针实现3*4矩置阵的转置
C语言-利用指针实现3*4矩置阵的转置
421 0
|
7月前
|
C语言
C语言一元多项式的表示及相加讲解及相关代码
C语言一元多项式的表示及相加讲解及相关代码
259 0
|
C语言
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
241 1
二维数组实验题:按如下公式递归计算矩阵行列式的值:(C语言)
|
存储 C语言
除自身以外数组的乘积(c语言详解)
除自身以外数组的乘积(c语言详解)
67 0
|
C语言
C语言:前20阶求和
首先我们要知道这道题目n!是什么,怎么拆分。
113 0