【数据结构】第七周
目录
稀疏矩阵快速转置
三元组的矩阵加法
九宫格数独游戏
数组主元素
螺旋数字矩阵
蛇形矩阵
数组循环右移K位
稀疏矩阵快速转置【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。而矩阵转置就是将矩阵行和列上的元素对换。 请你实现一个快速的对稀疏矩阵进行转置的算法。 (注意:我看到部分同学提交的代码是简单转置+排序,请务必修改为快速转置算法哦。) 【输入形式】 输入的第一行是两个整数r和c(r<200, c<200, r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r行,每行有c个整数,用空格隔开,表示这个稀疏矩阵的各个元素。 【输出形式】 输出为读入的稀疏矩阵的转置矩阵。输出共有c行,每行有r个整数,每个整数后输出一个空格。请注意行尾输出换行。 【样例输入】 6 7 【样例输出】 0 0 -3 0 0 15 【提示】 第二组测试数据行列较大,注意空间开大一点哦。 |
#include<iostream>
using namespace std;
int text[1000][1000];
#define MAX 10001struct tr{int row;int col;int e;
};
struct ts{tr data[MAX];int m,n,len;
};void create(ts &a,int x,int y)
{a.len=0;for(int i=0;i<x;i++){for(int j=0;j<y;j++){if(text[i][j]!=0){a.data[a.len].row=i;a.data[a.len].col=j;a.data[a.len].e=text[i][j];a.len++;}}}
}
void tran(ts &a,ts &b,int x,int y)
{int tmp,Col;int t=0;int num[1000]={0};int position[1000];for(int i=0;i<a.len;i++)num[a.data[i].col]++;position[0]=0;for(int i=1;i<y;i++){position[i]=position[i-1]+num[i-1];}for(int i=0;i<a.len;i++){Col=a.data[i].col;tmp=position[Col];b.data[tmp].row=a.data[i].col;b.data[tmp].col=a.data[i].row;b.data[tmp].e=a.data[i].e;position[Col]++; }for(int i=0;i<y;i++){for(int j=0;j<x;j++){if(b.data[t].row==i&&b.data[t].col==j){cout<<b.data[t].e<<" ";t++;}else{cout<<"0 ";}}cout<<endl;}
}
int main()
{ts a,b;int i,j,x,y;cin>>x>>y;for(i=0;i<x;i++){for(j=0;j<y;j++)cin>>text[i][j];}create(a,x,y);tran(a,b,x,y);
}
三元组的矩阵加法【问题描述】 以三元组表存储的稀疏矩阵A、B非零元个数分别为m和n。试编写程序,完成A+B。 【输入形式】 第一排为分别为A、B元素的个数,以下各排分别输入对应的三元组,头m组为A中的元素,接下来为B的元素,同一个矩阵的元素按照行递增排列,第一行规定为1,同一行的元素按照列递增排列,第一列规定为1 【输出形式】 为相应的三元组,以回车分开,如果结果全部为0,则输出 -1 -1 -1 【样例输入】 2 1 1 2 3 1 3 4 1 3 3 【样例输出】 1 2 3 1 3 7 | 40 |
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct{int row,col;int e;
}matrix;
bool cmp(matrix x,matrix y)
{if(x.row<y.row) return 1;else if(x.row==y.row&&x.col<y.col) return 1;else return 0;
}
int main()
{matrix a[500],b[500];int x,y,cnt=0;cin>>x>>y;for(int i=0;i<x;i++)cin>>a[i].row>>a[i].col>>a[i].e;for(int i=0;i<y;i++)cin>>b[i].row>>b[i].col>>b[i].e;int k=x;for(int i=0;i<y;i++){int flag = 1,j;for(j=0;j<x;j++){if(a[j].row==b[i].row&&a[j].col==b[i].col){flag = 0;a[j].e+=b[i].e;}}if(flag){a[k].e=b[i].e;a[k].row=b[i].row;a[k++].col=b[i].col;}}sort(a,a+k,cmp);for(int i=0;i<k;i++){if(a[i].e!=0)cnt++;}if(cnt==0){cout<<"-1 -1 -1"<<endl;return 0;}else{for(int i=0;i<k;i++){if(a[i].e!=0)cout<<a[i].row<<" "<<a[i].col<<" "<<a[i].e<<endl;}}return 0;
}
九宫格数独游戏【问题描述】 【输入形式】 【样例输出】 |
#include<iostream>
#include<cstring>
using namespace std;
int a[10][10];
bool row[10][10],col[10][10],g[10][10];void display()
{for(int i=1;i<=9;i++){for(int j=1;j<=9;j++)cout<<a[ i ][ j ]<<" ";cout<<endl;}
}
void dfs( int x ,int y)
{if(a[ x ][ y ] != 0){if( x == 9 &&y == 9)display();if( y == 9 )dfs( x + 1 , 1);elsedfs( x , y + 1 );}else{for( int i = 1 ; i <= 9 ; i++ ){if(row[x][i] && col[y][i] && g[(x-1)/3*3+(y-1)/3+1][i]){a[x][y] = i;row[x][i] = 0;col[y][i] = 0;g[(x-1)/3*3+(y-1)/3+1][i] = 0;if( x == 9 && y==9 )display();if( y==9 )dfs( x + 1, 1 );elsedfs( x , y + 1);a[x][y]=0;row[ x ][ i ]=1;col[ y ][ i ]=1;g[(x-1)/3*3+(y-1)/3+1][i]=1;}}}
}int main()
{memset(row,1,sizeof(row));memset(col,1,sizeof(col));memset(g,1,sizeof(g));for(int i=1;i<=9;i++){for(int j=1;j<=9;j++){cin>>a[i][j];if(a[i][j]>0){row[ i ][ a[i][j] ]=0;col[ j ][ a[i][j] ]=0;g[(i-1)/3*3+(j-1)/3+1][a[i][j]]=0;}}}dfs(1,1);return 0;
}
数组主元素【问题描述】这是一道2013年考研真题,已知一个整数序列A长度为N,其中若存在a,且a的个数大于N/2,则称a为A的主元素 例如:3 5 5 3 5 7 5 5,其主元素为5 又如:3 5 5 3 5 1 5 7,其中没有主元素。 假设元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出主元素。若存在主元素则输出该元素否则输出 要求时间复杂度为O(N),请注意穷举法时间复杂度是O(N^2),排序再遍历查找的时间复杂度是O(N*logN+N) 【输入形式】 一个整数数组,以0作为结束输入 【输出形式】 主元素,若没有则输出-1 【样例输入】 3 5 5 3 5 7 5 5 0 【样例输出】 5 【样例说明】长度为8,共有5个‘5’ |
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{int a[100];int len=0,i=0;int sc;while(1){cin>>sc;if(sc==0) break;else a[i++]=sc;}len=i;
// for(int i=0;i<len;i++)
// cout<<a[i]<<" ";if(len==0) return 0;sort(a,a+len);
// cout<<endl;
// for(int i=0;i<len;i++)
// cout<<a[i]<<" ";int start=0,rail=0;int kk=a[len/2];for(int i=0;i<len;i++){if(a[i]==kk){start=i;break;}}for(int i=len-1;i>=0;i--){if(a[i]==kk){rail=i;break;}}
// cout<<endl<<start<<" "<<rail<<endl;int cnt=rail-start+1;if(cnt>(len/2)){cout<<kk;}else{cout<<"-1";}return 0;
}
螺旋数字矩阵
【问题描述】 编写一个程序,对任意输入的正整数n(n不大于10),产生并显示n阶螺旋式数字方阵。如n=3 要显示的方阵为
1 2 3
8 9 4
7 6 5
【输入形式】输入一个数n
【输出形式】产生n阶螺旋数字矩阵,数字以空格隔开
【样例输入】3
【样例输出】
1 2 3
8 9 4
7 6 5
【样例说明】注意输出的数字以空格隔开
#include<iostream>
#include<cstring>
using namespace std;
int dirx[4]={0,1,0,-1};
int diry[4]={1,0,-1,0};
int map[12][12];
int a[12][12];
int main()
{memset(map,sizeof(map),0);int n;cin>>n;for(int j=0;j<n+2;j++){map[0][j]=1;map[j][0]=1;map[n+1][j]=1;map[j][n+1]=1;}int num=n*n;int kk=1;a[1][1]=1;map[1][1]=1;int last=0;int i=1,j=1;while(--num){if(map[i+dirx[last]][j+diry[last]]==0){ i=i+dirx[last];j=j+diry[last];a[i][j]=++kk;map[i][j]=1;continue;}else{if(last==3) last=0;else last++;num++;continue;}}for(i=1;i<=n;i++){for(j=1;j<=n;j++)cout<<a[i][j]<<" ";cout<<endl;}}
蛇形矩阵【问题描述】蛇形矩阵是由1开始的自然数依次排列成的,按对角线方向依次递增 例如n=5时: 1 2 6 7 15 【输入形式】n 【输出形式】蛇形矩阵 【样例输入】5 【样例输出】 1 2 6 7 15 3 5 8 14 16 4 9 13 17 22 10 12 18 21 23 11 19 20 24 25 | 1.00 |
#include<bits/stdc++.h>
using namespace std;
int main()
{int a[20][20] = { 0 };int n = 0, m = 1;int i = 0, j = 0, flag = 0;cin>>n; while (m <= n * n){while (i >= 0 && (m <= n * n) && j <= n - 1){a[i][j] = m++;i--;j++;}flag++;if (flag < n)i++;else if (flag == n){i += 2;j--;}else{i += 2;j--;}while (j >= 0 && (m <= n * n) && i <= n - 1){a[i][j] = m++;i++;j--;}flag++;if (flag < n)j++;else if (flag == n){j += 2;i--;}else{i--;j += 2;}}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++)printf("%d ", a[i][j]);cout<<endl;}return 0;
}
数组循环右移K位【问题描述】将一个数组中的元素循环右移K位,要求只使用一个元素大小的附加存储空间,时间复杂度为O(n)。 【样例输入】 1 2 3 4 5 6 7 8 0 2 【样例输出】 7 8 1 2 3 4 5 6 【提示】0代表输入结束 |
#include <iostream>
using namespace std;
void reverse(int start, int end, int a[], int temp)
{while (start < end){temp = a[start];a[start] = a[end];a[end] = temp;start++;end--;}
}
void move(int n, int len, int a[])
{//先把前len-step位逆置reverse(0, len - n - 1, a, a[len]);//再把后step位逆置reverse(len - n, len - 1, a, a[len]);//最后总体逆置reverse(0, len - 1, a, a[len]);
}
int main()
{ios::sync_with_stdio(false);int a[1000];int i = 0;while (1){cin >> a[i];if (a[i] == 0)break;i++;}int len = i;int step;cin >> step;step = step % len;move(step, len, a);for (int i = 0; i < len; i++)cout << a[i] << " ";
}
相关文章:

【数据结构】第七周
目录 稀疏矩阵快速转置 三元组的矩阵加法 九宫格数独游戏 数组主元素 螺旋数字矩阵 蛇形矩阵 数组循环右移K位 稀疏矩阵快速转置 【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存…...

人体三维重构论文集合:awesome 3d human reconstruction
A curated list of related resources for 3d human reconstruction. Your contributions are welcome! Contents papers AIGCnerf or pifugeo fusionphoto3D human whole body3D human...

揭秘Redis持久化原理,探索fork与Copy-on-Write的魔法!
大家好,我是小米,今天我将和大家一起探索Redis持久化原理中的两个关键概念:fork和Copy-on-Write。这两个概念对于理解Redis的数据持久化机制至关重要。让我们一起来揭开这些技术的神秘面纱吧! Redis持久化简介 在开始之前&#…...

应届生如何提高职场竞争能力
摘要: 应届生面对竞争激烈的职场,需要不断提高自身的职业素养和竞争能力,才能在激烈的竞争中脱颖而出。本文从积极心态的培养、专业知识的优化、职业规划的制定、团队协作的加强和自我拓展的开展五个方面,提出了提高应届生职场竞争…...

ISIS 实验
(1)拓扑图 2)需求: -实现PC1和PC2的通信 3)配置步骤: -配置接口IP地址 -开启ISIS---类似于在OSPF中创建进程 -配置NET地址---类似于在OSPF中创建区域,指定Router-id -在接口上启用ISIS--类似于在OSPFv2中用ne…...

国产系统:麒麟之人大金仓数据库部署
一、基本信息和资源 1.1 查看服务器信息 [root7PGxjKPL4 ~]# cat /etc/*release Kylin Linux Advanced Server release V10 (Sword) DISTRIB_IDKylin DISTRIB_RELEASEV10 DISTRIB_CODENAMEjuniper DISTRIB_DESCRIPTION"Kylin V10" DISTRIB_KYLIN_RELEASEV10 DISTRI…...

flink1.17.0 集成kafka,并且计算
前言 flink是实时计算的重要集成组件,这里演示如何集成,并且使用一个小例子。例子是kafka输入消息,用逗号隔开,统计每个相同单词出现的次数,这么一个功能。 一、kafka环境准备 1.1 启动kafka 这里我使用的kafka版本…...

【华为OD机试】数组组成的最小数字【2023 B卷|100分】
【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述: 一行用半角逗号分割的字符串记录的整型数…...

Exponential Loss 中的关于indicator 函数的一个恒等式
− x y 2 I ( x ≠ y ) − 1 -xy2\mathbf{ I}(x \ne y)-1 −xy2I(xy)−1 其中 I \mathbf{ I} I 是 indicator 函数, 定义域 为True ,函数值为 1 反之为 0 x,y 都 可以取值 {-1,1} 证明过程见下表: xy左式右式-1-1-1-111-1-1-11111-111...

【机器学习】浅析过拟合
过度拟合 我们来想象如下一个场景:我们准备了10000张西瓜的照片让算法训练识别西瓜图像,但是这 10000张西瓜的图片都是有瓜梗的,算法在拟合西瓜的特征的时候,将西瓜带瓜梗当作了一个一般性的特征。此时出现一张没有瓜梗的西瓜照片…...

尝试在UNet的不同位置添加SE模块
目录 (1)se-unet01(在卷积后,下采样前,添加SE模块) (2)se-unet02(在卷积后,上采样前,添加SE模块) (3)se-un…...

JVM垃圾回收篇之相关概念和算法
垃圾回收相关概念 什么是垃圾 垃圾就是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收掉的垃圾,如果不及时进行清理,越积越多就会导致内存溢出. 为什么需要GC 不进行回收,早晚会导致内存溢出,Java自动管理垃圾回收,不需要开发人员手动干预,这就有可能导致开…...

(学习日记)2023.04.27
写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…...

亚马逊CPC广告每日该怎么调整?
01 CPC广告需要每日调整吗? 其实,亚马逊广告是不建议每天都做过多调整的。 为什么呢?调整太频繁了,看不到每天调整的结果是不是? 什么时候需要调整呢? 就是广告指标,比如说曝光、点击、转化率情…...

ffmpeg下载及ffmpy3安装使用
ffmpeg下载及ffmpy3安装使用 1.下载ffmpeg 进入网址:https://www.gyan.dev/ffmpeg/builds/ 在release builds中下载ffmpeg-release-full.7z 下载好后解压到自己想存放的目录,例如:D:\Tool\ffmpeg-6.0-full_build 2.配置环境变量 右键此电…...

设计模式之~原型模式
定义:用原型实例指导创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。 优点: 一般在初始化的信息不发生变化的情况下,克隆是最…...

多传感器融合SLAM --- 8.LIO-SAM基础知识解读
目录 1 惯性测量单元简介及预积分 1.1 IMU 器件介绍及选型建议 1.2 IMU状态传递方程...

多模态大模型时代下的文档图像智能分析与处理
多模态大模型时代下的文档图像智能分析与处理 0. 前言1. 人工智能发展历程1.1 传统机器学习1.2 深度学习1.3 多模态大模型时代 2. CCIG 文档图像智能分析与处理论坛2.1 文档图像智能分析与处理的重要性和挑战2.2 文档图像智能分析与处理高峰论坛2.3 走进合合信息 3. 文档图像智…...

SAP-MM-内向外向交货单
1、内向&外向交货单概念 外向交货(outbound delivery)是用在客户与企业之间的交货单,而内向交货(inbound delivery)则是用在供应商与企业之间的交货单;换言之,外向交货多用于SD 模块&#…...

Mysql - date、datetime、timestamp 的区别
date、datetime 的区别 顾名思义,date 日期,datetime 日期时间,所以 date 是 datetime 的日期部分MySQL 以 格式检索和显示 datetime 值 YYYY-MM-DD hh:mm:ss datetime 支持的日期时间范围 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 d…...

离散数学_十章-图 ( 4 ):图的表示和图的同构
📷10.4 图的表示和图的同构 1. 图的表示1.1 邻接表1.1.1 简单图的邻接表1.1.2 有向图的邻接表 1.2 邻接矩阵❗在邻接表和邻接矩阵之间取舍1.3 关联矩阵 2. 图同构3. ⚡判断两个简单图是否同构 图的表示方式有很多种,选择最方便的表示有助于对图的处理~ …...

MySQL锁的分类
MySQL锁的分类 全局锁 表级锁 ● 表锁 ● 元数据锁,Meta Data Lock,MDL锁 ● 意向锁 ● AUTO_INC 锁 行级锁(Innodb引擎牛比的地方) ● record lock,记录锁,也就是仅仅把一条记录给锁上了 ● gap lock,间隙锁ÿ…...

程序员如何给变量起名字
程序员如何给变量起名字 在编写代码时,为变量命名是非常重要的。良好的命名习惯可以提高代码的可读性和可维护性,使得其他开发者能够更容易地理解你的代码。在这篇文章中,我们将讨论程序员如何为变量选择合适的名称。 规范 首先࿰…...

隔板法(求解的组数)
文章目录 隔板法(求解的组数)隔板法扩展 例题 隔板法(求解的组数) 文章首发于我的个人博客:欢迎大佬们来逛逛 隔板法 隔板法能够解决的问题: 求线性不定方程的解的组数求相同元素分组的方案数 给我们 …...

智能文档处理黑科技,拥抱更高效的数字世界
目录 0 写在前面1 为何要关注智慧文档?2 图像弯曲矫正3 手写板反光擦除4 版面元素检测5 文档篡改检测总结 0 写在前面 近期,中国图象图形学学会文档图像分析与识别专业委员会与上海合合信息科技有限公司联合打造了《文档图像智能分析与处理》高峰论坛。…...

vue ts写法
Vue.js 和 TypeScript 结合使用可以让你的项目更加健壮和易于维护。在 Vue 3 中,你可以使用 Vue.js 的 Composition API 和 TypeScript 一起使用。以下是一个简单的 Vue.js 和 TypeScript 结合使用的例子: 首先,确保你已经安装了 Vue.js 和 T…...

Unity中的PostProcessBuild:深入解析与实用案例
Unity中的PostProcessBuild:深入解析与实用案例 在Unity游戏开发中,我们经常需要在构建完成后对生成的应用程序进行一些额外的处理。这时,我们可以使用Unity提供的PostProcessBuild功能。本文将详细介绍Unity中的PostProcessBuild方法&#…...

SimpleCG绘图函数(4)--绘制圆
在前一篇教程我们利用绘制矩形功能绘制了一个城市,接下来我们讲解另外一个同样重要且基础的图形----圆形。并一起看看该图形能绘制哪些应用呢。 绘制圆形相关函数如下: //圆心坐标(nXCenter,nYCenter),半径为nRatio//绘无填充制圆 void circle( int nXCenter, int …...

打包和优化
私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 系列文章目录 前端系列文章——传送门 后端系列文章——传送…...

linuxOPS基础_Linux文件管理
Linux下文件命名规则 可以使用哪些字符? 理论上除了字符“/”之外,所有的字符都可以使用,但是要注意,在目录名或文件名中,不建议使用某些特殊字符,例如, <、>、?、* 等&…...