【数据结构】第七周

news2024/10/5 22:23:26

稀疏矩阵快速转置

【问题描述】

        稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。而矩阵转置就是将矩阵行和列上的元素对换。

        请你实现一个快速的对稀疏矩阵进行转置的算法。

(注意:我看到部分同学提交的代码是简单转置+排序,请务必修改为快速转置算法哦。)

【输入形式】

        输入的第一行是两个整数r和c(r<200, c<200, r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r行,每行有c个整数,用空格隔开,表示这个稀疏矩阵的各个元素。

【输出形式】

        输出为读入的稀疏矩阵的转置矩阵。输出共有c行,每行有r个整数,每个整数后输出一个空格。请注意行尾输出换行。

【样例输入】

6 7
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 14 0
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 -7 0 0 0

【样例输出】

0 0 -3 0 0 15
12 0 0 0 18 0
9 0 0 24 0 0
0 0 0 0 0 -7
0 0 0 0 0 0
0 0 14 0 0 0
0 0 0 0 0 0 

【提示】

第二组测试数据行列较大,注意空间开大一点哦。

#include<iostream>
using namespace std;
int text[1000][1000];
#define MAX 10001

struct 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;
}

九宫格数独游戏

【问题描述】
 数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9X9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。要求使用合适的数据结构和算法,求解出所有剩余空格的数字。

【输入形式】
 输入为9X9的二维数组,每个数字均为0-9之间的数字,其中0表示该位置的数字为未知。

【输出形式】
 输出为9X9的二维数组,每个数字均为1-9之间的数字,满足

【样例输入】

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

【样例输出】

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

【评分标准】
深搜或者其他算法均可
 

#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);
        else
            dfs( 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 );
                    else
                        dfs( 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
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25

【输入形式】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代表输入结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589412.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xxl-job的部署及springboot集成使用

介绍 XXL-Job是一个分布式任务调度平台&#xff0c;可进行任务调度、管理和监控&#xff0c;并提供任务分片、失败重试、动态分配等功能。它是一个开源项目&#xff0c;基于Spring Boot和Quartz开发&#xff0c;支持常见的任务调度场景。 XXL-Job的使用相对简单&#xff0c;只…

自学网络安全最细规划(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

微信小程序后台:解决微信扫普通链接地址无法跳转到体验版微信的问题,配置普通链接二维码规则解释和理解

微信小程序后台&#xff1a;解决微信扫普通链接地址无法跳转到体验版微信的问题&#xff0c;配置普通链接二维码规则解释和理解 一、现象与原因 最近突然发现微信管理平台中&#xff0c;设置好的普通二维码连接跳转到体验版小程序的功能&#xff0c;没有区分体验版和生产版&a…

条件变量基本使用

一、条件变量 应用场景&#xff1a;生产者消费者问题&#xff0c;是线程同步的一种手段。 必要性&#xff1a;为了实现等待某个资源&#xff0c;让线程休眠。提高运行效率 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); int pthr…

手把手教你做独立t检验

一、案例介绍 为研究国产四类新药阿卡波糖胶囊的降血糖效果&#xff0c;某医院用40名2型糖尿病患者进行同期随机对照试验。研究者将这些患者随机等分到试验组&#xff08;用阿卡波糖胶囊&#xff09;和对照组&#xff08;用拜唐苹胶囊&#xff09;&#xff0c;分别测得试验开始…

如何使用宝塔面板搭建网站(Linux服务器配置篇)

搭建网站我们需要&#xff1a; 必须是Linux服务器&#xff08;最低要求配置1核1G当然再低些也能运行但是不建议&#xff09;自己的域名&#xff08;可以去阿里云或者腾讯云了解&#xff09;PHP项目 此处展示的是华为云服务器&#xff08;各个服务器的购买和使用差别不大&#…

“以API接口快速获得aliexpress速卖通商品详情-返回值说明

为了方便商家获取速卖通上的商品信息&#xff0c;速卖通提供了API接口来获取商品数据。本文将介绍如何通过API接口获取速卖通商品数据。 一、申请API接口权限 在使用API接口前&#xff0c;首先需要在速卖通官网注册账号并通过实名认证。然后&#xff0c;在个人资料页面找到开…

Java 的多线程浅析

前言 Java 的多线程在当今业界已经成为了一个非常重要的技能。无论您是新手还是经验丰富的程序员&#xff0c;精通 Java 的多线程编程都是至关重要的。因为多线程可以帮助您实现更快的应用程序、更高效的性能以及更出色的用户体验。在这篇文章中&#xff0c;我们将介绍有关 Ja…

【资料分享】PLC中输入输出端子

PLC输入输出分为高速和低速&#xff0c;一般来说不会超出&#xff0c;隔离器MOS的设计。其中具体采用光耦隔离还是数字隔离器隔离&#xff0c;其隔离器件会限制其输入输出的速率&#xff1b;PLC的源型和漏型就取决于最后末端所接的MOS管是如何布置的。 MOS管的源极和漏极 MOS…

Java 注解配合Spring AOP 导入Excel文件

Java 注解配合Spring AOP 导入Excel文件 这个就是把上一篇&#xff0c;封装了一层&#xff1b;根据注解中配置的变量名和方法名&#xff0c;通过JoinPoint获取到对应的对象和方法 注解 import static java.lang.annotation.ElementType.METHOD; import static java.lang.ann…

02 Redis经典五种数据类型介绍及落地运用

命令大全9大类型 String(字符类型)Hash(散列类型)List(列表类型)Set(集合类型)SortedSet(有序集合类型&#xff0c;简称zset)Bitmap(位图)HyperLogLog(统计)GEO(地理)Stream&#xff08;了解&#xff09; string 常用命令 最常用 set key valueget key 同时设置/获取多个键…

Spring之状态机讲解

文章目录 1 状态机1.1 什么是状态1.2 四大概念1.3 状态机1.4 spring statemachine 2 示例Demo2.1 订单状态图2.2 建表2.3 依赖和配置2.3.1 pom.xml2.3.2 application.yml 2.4 状态机配置2.4.1 定义状态机状态和事件2.4.2 定义状态机规则2.4.3 配置持久化2.4.3.1 持久化到内存2.…

畅游星河的炫彩手柄,配置也不简单,北通阿修罗2Pro上手

平时在PC上玩个游戏&#xff0c;还是手柄更好用。在国产的手柄里面&#xff0c;北通的很多人都用&#xff0c;选择比较多&#xff0c;价格相对也更加亲民一些&#xff0c;之前看到北通阿修罗2Pro新出了一款无线星河版本&#xff0c;做得很好看&#xff0c;上周到手后试了试&…

元宇宙,开启下一个消费Z时代

元宇宙到底怎么了&#xff1f;为什么国外一片唱衰&#xff0c;而国内却依旧不遗余力的积极推动&#xff1f;接下来&#xff0c;国内元宇宙又将带来怎样的机遇&#xff1f; 此时此刻&#xff0c;元宇宙被一味吹捧的阶段已经过去&#xff0c;取而代之的是并存的唱衰声与叫好声&a…

《Opencv3编程入门》学习笔记—第三章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第三章 HighGUI图形用户界面初步 一、图像的载入、显示和输出到文件 &#xff08;一&#xff09;OpenCV的命名空间 简单的OpenCV程序标配&#xff1a; #include <o…

如何利用Citespace和vosviewer既快又好地写出高质量的论文及快速锁定热点和重点文献进行可视化分析

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

Oracle实现主键字段自增

Oracle实现主键自增有4种方式&#xff1a; Identity Columns新特性自增&#xff08;Oracle版本≥12c&#xff09; 创建自增序列&#xff0c;创建表时&#xff0c;给主键字段默认使用自增序列 创建自增序列&#xff0c;使用触发器使主键自增 创建自增序列&#xff0c;插入语句&…

都2023年了,你竟然还不知道网络安全该怎么学!

前言 网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然或恶意原因而遭受破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 网络安全因何而重要&#xff1f; 截至2022年6月,我国网民规模为10.51亿&#xff0c…

nodejs 中使用websocket 并且区分空间,实现收到客服端消息 同步给房间内所有连接,小程序中使用websocket,区分房间、空间

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言一、服务端1、主要是通过nodeexpresswebsocket搭建2、代码大概结构3、nodejs 启动入口文件 引入自己的websocket文件&#xff0c;这里是为了和 http 服务结合起来&#xff0c;将server传入4、websocket.j…

【课代表笔记】直播回顾:Top药企的数字化实践集锦

【K讲了】系列直播之医药行业第一期&#xff1a;Top药企的数字化实践集锦前不久已在视频号和大家如期见面&#xff0c;以下是课代表为大家抄好的笔记~~ 斯歌K2的医药行业经验 K2在医药领域拥有丰富的客户积累及实施经验&#xff0c;全球TOP 10药企中有7家选择K2。斯歌K2已在医药…