当前位置: 首页 > news >正文

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>
using namespace std;
​
const int N = 10;
​
//按数字顺序生成二维数组
void FuZhi(int n,int a[][10])
{int k = 0; for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){k++;a[i][j] = k;}}
}
​
//转置,行和列互换
void ZhuanZ(int n,int a[][N])
{for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (i > j){int t = a[i][j];a[i][j] = a[j][i];a[j][i] = t;}}}
}
​
//打印
void Print(int n,int a[][10])
{for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cout<<a[i][j];}cout << endl;}
}
​
int main()
{int n; cin >> n;if (n > 1 && n <= N) {int a[N][N];FuZhi(n, a);Print(n, a);cout << "转置后:" << endl;ZhuanZ(n, a);Print(n, a);}
​system("pause"); return 0;
}
​
// 矩阵转置
void Demo61() {//--变量声明--// 矩阵边长, 矩阵本身, 转置后数组int size, arr[10][10], result[10][10];//--接收输入--scanf_s("%d", &size);for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {scanf_s("%d", &arr[i][j]);}}//--数据处理--for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {result[j][i] = arr[i][j];}}
​
​//--输出--for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {printf("%d ", result[i][j]);}printf("\n");}
​
}

2.矩阵90°转置

// 颈椎病
void Demo62() {//--变量声明--// 矩阵边长, 矩阵本身, 转置后数组int size, arr[10][10], result[10][10];//--接收输入--scanf_s("%d", &size);for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {scanf_s("%d", &arr[i][j]);}}
​//--数据处理--for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {result[j][size - i - 1] = arr[i][j];}}
​//--输出--for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {printf("%d ", result[i][j]);}printf("\n");}
}

详细分析:

//数组下标变化:假设size为30 1 2                     0 1 2 31 4 5 6       2 7 8 9->0 1 2 0 7 4 11 8 5 2    2 9 6 3x1 y    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>
using namespace std;
​
void Print(int n, int a[][10]);
​
void YH(int n)
{int a[10][10];//计算杨辉三角, 以下三角矩阵的形式存放在二维数组for (int i = 0; i < n; i++) {a[i][0] = 1;a[i][i] = 1;for (int j = 1; j < i; j++)a[i][j] = a[i - 1][j - 1] + a[i - 1][j];    //i不可能取值为0导致地址越界 }Print(n,a);
}
​
void Print(int n,int a[][10])
{for (int i = 0; i < n; i++) {for (int j = 1; j <= n - 1 - i; j++)        //打印每行开始的空格 cout << " ";for (int j = 0; j <= i; j++)            //每行打印的数据个数cout << a[i][j] << " ";cout << endl;}
}
​
int main() {int n; cin >> n;YH(n);system("pause"); return 0;
}
​
// 杨辉三角
void Demo63() {//--变量声明--// 杨辉三角的高度int n;// 存储用数组,  注意杨辉三角只会占用一半的空间, 所以这里可以用malloc动态分配来避免空间浪费int arr[10][10];//--接收输入--scanf_s("%d", &n);arr[0][0] = 1;
​//--数据处理--// 左右两侧数据直接填充即可for (int i = 1; i < n; i++) {arr[i][0] = arr[i][i] = 1;for (int j = 1; j < i; j++) {arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];}}//--输出--for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) {printf("%d ", arr[i][j]);}printf("\n");}
}
​

4.包围圈

// 包围圈
void Demo64() {//--变量声明--int size, tree[10][10];// 当前坐标xy, 移动方向toward 0左 1下 2右 3上, 填充数// 注意 由于第一次探查前会先移动 x++  所以x需要修正为-1int x = -1, y = 0, toward = 0, num = 0;// 一个方向的移动步数int s;
​//--接收输入--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 (int i = 0; num<size*size; i++) {// 奇数次循环 最大步数-1if (i % 2 == 1) s--;for (int j = 0; j < s; j++) {// 获取方向并移动switch (toward) {case 0:x++;break;case 1:y++;break;case 2:x--;break;case 3:y--;break;}tree[y][x] = ++num;}
​//  改变方向  注意 当toward为3  也就是向上时, 需要取模操作 也就是变为0// (1+1) %4 = 2   (3+1) %4=0toward = (toward + 1) % 4;}
​
​//--输出--for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {printf("%d ", tree[i][j]);}printf("\n");}
}
​
http://www.lryc.cn/news/231035.html

相关文章:

  • 父组件用ref获取子组件数据
  • Haskell添加HTTP爬虫ip编写的爬虫程序
  • MySQL 社区开源备份工具 Xtrabackup 详解
  • 【仿真】ruckig在线轨迹生成器示例
  • LeetCode 面试题 16.22. 兰顿蚂蚁
  • Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
  • 科研学习|研究方法——Python计量Logit模型
  • 灵活运用Vue指令:探究v-if和v-for的使用技巧和注意事项
  • nvidia-docker部署pytorch服务【GPU工作站】
  • 单链表的实现
  • 【python】面向对象(类型定义魔法方法)
  • 1.微服务与SpringCloud
  • 【2023全网最全最火】Selenium WebDriver教程(建议收藏)
  • dimp 导入dmp文件报错:无效的模式名(DM8:达梦数据库)
  • 宿主机无法连接docker里的redis问题解决(生产环境慎用)
  • 给女朋友开发个小程序低价点外卖吃还能赚钱
  • 外贸客户管理系统是什么?推荐的管理软件?
  • 数据挖掘:分类,聚类,关联关系,回归
  • 力扣labuladong一刷day10一网打尽股票买卖问题共6题
  • 微信小程序手写table表格
  • UE5 - UI Material Lab 学习笔记
  • oracle删除重复的数据
  • Python中的并发编程是什么,如何使用Python进行并发编程?
  • 【LeetCode】136. 只出现一次的数字
  • HTTP服务器——tomcat的安装和使用
  • 代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和
  • 写了个监控 ElasticSearch 进程异常的脚本!
  • 第三篇 基于JSP 技术的网上购书系统—— 数据库系统设计(网上商城、仿淘宝、当当、亚马逊)
  • 电脑检测温度软件有哪些?
  • 设计模式 -- 单例模式(Singleton Pattern)