西工大NOJ数据结构实验——2.1稀疏矩阵转置

这篇具有很好参考价值的文章主要介绍了西工大NOJ数据结构实验——2.1稀疏矩阵转置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

西工大NOJ数据结构实验——2.1稀疏矩阵转置

对稀疏矩阵进行转置操作,按照老师讲的,有两种办法。我用的是第一种最简单的,从上到下一行一行得走,虽然速度很慢,但是简单。

说实话这个题目很讨厌,我们定义的三元组里面mu表示的是行数,但是题目要求输入的m表示的是列数,这就很容易搞混了。

但是我们不用n和m表示行和列,而是用线性代数里面的r表示行,c表示列,这样做不容易错,反正它先输入的永远是行,后输入的永远是列。

其中进行转置操作的函数function,感觉很像咱们上学期用过的“冒泡排序”。

为什么答案都对但是仍然WA的原因:

首先,大概率就是输出输入的问题,也就是说,问题十有八九都出在了printf和scanf这两个函数上

下面我分情况讨论一下允许的输入格式:

1.输入两个正整数:

scanf("%d%d",&m,&n);        正确

scanf("%d %d",&m,&n);        正确

2.输入矩阵三元组:(我就栽在这个地方了mmp)

scanf("%d%d%d",&i,&j,&x);

if(i==0&&j==0&&x==0) break;        错误!

scanf("%d %d %d",&i,&j,&x);

if(i==0&&j==0&&x==0) break;        错误!

(具体为什么错误我也不清楚,反正这样做就是不对,不是RE就是WA)

(4.17日最新更新:上面的两个错误,好像又可以AC通过了,搞得我很懵圈)

(懵圈过后,我就开始怀疑,之前WA的原因,十有八九是因为我把“&&”写成了“&”)

scanf("%d",&i);

getchar();

scanf("%d",&j);

getchar();

scanf("%d",&x); 

if(i==0&&j==0&&x==0) break;        正确!

3.输出转置后的矩阵三元组:

printf("%d %d %d\n"...)        正确!

printf("%d %d %d \n"...)        正确!

其次,小概率不是输入输出的问题,而是样例输出给的不够好,题目本身有问题!

为什么呢?因为如果你输入这样:

西工大NOJ数据结构实验——2.1稀疏矩阵转置

它的意思并不是下面这个矩阵:

 西工大NOJ数据结构实验——2.1稀疏矩阵转置

 它表示的其实是这个矩阵!!!

西工大NOJ数据结构实验——2.1稀疏矩阵转置

没想到叭!我就是第二次栽到了这里。

那这又是什么意思呢?意思就是:

在测试用例中,存在一种情况,比如说:

4 4

1 0 1

2 1 2

3 2 3

0 0 0

其中,1 0 1这种奇葩数据,它居然能拿得出来!!!

也就是说,在我们编写“矩阵转置”函数时,如果把第1层函数头写成下面这样子,是不对的:

for(int fre=1;fre<=p1->nu;fre++){

正确的应该是下面这样子:

for(int fre=0;fre<p1->nu;fre++){

下面是我AC的代码,希望能帮到大家:

最后如果对大家有所帮助,希望大家可以加关注哦。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
typedef struct Triple{
	int i,j;
	int x; 
}Triple;

typedef struct TSMatrix{
	Triple data[1000];
	int mu,nu,tu;
}TSMatrix; 

TSMatrix* CreateEmptyTsmatrix(){
	 TSMatrix *p=(TSMatrix*)malloc(sizeof(TSMatrix));
	 if(p==NULL){
	 	printf("Out of space!\n");
	 }else{
	 	p->mu=0;
	 	p->nu=0;
	 	p->tu=0;
	 	return p;
	 }
}

void Insert(TSMatrix *p,int i,int j,int x,int k){
	p->data[k].i=i;
	p->data[k].j=j;
	p->data[k].x=x;
	p->tu=p->tu+1;
}

void BuildTsmatrix(TSMatrix* p){
	int k=0;
	while(1){
		int i,j,x;
		scanf("%d",&i);
		getchar();
		scanf("%d",&j);
		getchar();
		scanf("%d",&x);
		if(0==i&&0==j&&0==x) break;
		//如果输入0?0?0,那么最终i=0,j=1,x=0,这样矩阵中的元素就输入完毕了 
		else{
			Insert(p,i,j,x,k);
			k++;
		}
	}
}

void Output(TSMatrix* p){
	 for(int k=0;k<p->tu;k++){
	 	printf("%d %d %d \n",
		 p->data[k].i,
		 p->data[k].j,
		 p->data[k].x);
	 }
}

void Transposition(TSMatrix* p1,TSMatrix* p2){//矩阵的转置
	int k2=0;
	for(int fre=0;fre<p1->nu;fre++){
	//1次fre能够完成p1中1列的转置
	//比如说,fre=0,把p1中第1列转置完成,变成p2的第1行 
	//然后fre=1,把p1中第2列转置完成,变成p2的第2行 
	//......
	//最后fre=p1->nu-1,把p1的最后一列转置完成,变成p2的第p1->nu行 
		for(int k1=0;k1<p1->tu;k1++){
			//完成p1中1列的转置时,从data[0]元素开始,挨个往下看,
			if(p1->data[k1].j==fre){
				//如果先找到了一个元素,它的列数正好是fre-1,那就放到p2里面 
				Insert(p2,
				 p1->data[k1].j,
				 p1->data[k1].i,
				 p1->data[k1].x,
				 k2);
				 k2++;//k2仅且仅需要初始化1次,所以k2的定义放在所有循环的外面 
			}
		}
	}
}

int main(){
	TSMatrix* p1=CreateEmptyTsmatrix();//p1放原矩阵 
	TSMatrix* p2=CreateEmptyTsmatrix();//p2放转置矩阵 
	int r,c;
	scanf("%d%d",&r,&c);//p1的行数为r,列数为c 
	p2->nu=p1->mu=r;
	p2->mu=p1->nu=c;
	
	BuildTsmatrix(p1);
	Transposition(p1,p2);
	Output(p2);
	return 0;
}

实在不行的话,点个赞也可以哦。文章来源地址https://www.toymoban.com/news/detail-424749.html

到了这里,关于西工大NOJ数据结构实验——2.1稀疏矩阵转置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023西工大NOJ (C语言版) 持续更新ing

    代码已同步至 gitee:2023NOJ(C语言版)! 题目过于 垃圾和睿智 ,做这种题简直是 浪费生命 ,甚至会让代码水平 剧烈下降 ,也就81-90题值得做一下,有这功夫不如多打会儿游戏。 贴出 100 题中全部 AC 代码, 并不保证代码正确性、可读性、简洁性、最佳性 ,只能保证AC;目

    2024年02月08日
    浏览(49)
  • 西工大 ASLP 实验室在 WeNet 中开源基于 CPPN 的神经网络热词增强语音识别方案

    语境偏置 (Contextual biasing)旨在将语境知识集成到语音识别(ASR)系统中,以提高在相关领域词汇(俗称“ 热词 ”)上的识别准确率。在许多ASR场景中,待识别语音中可能会包含训练数据中数量很少或完全没出现的短语,例如一些领域专有名词、用户通讯录中的人名等,这

    2024年02月07日
    浏览(33)
  • 数据结构实验——实验三--栈实验

    一、 实验任务 1.1 顺序栈实验任务 (1)利用顺序栈实现将10进制数转换为x进制数,2=x=36,除了阿拉伯数字字符,不够字符使用大写英文字符。要求键盘输入10进制数和转换的目标进制数。比如:37转换为20进制数为1H。 第一组数据:4 第二组数据:311 第三组数据:7254 第四组数据

    2023年04月09日
    浏览(29)
  • 数据结构实验———图实验

    一、实验内容 1.打印出图(网)的两种遍历序。 实验测试数据基本要求: 第一组数据: udg8.grp 第二组数据: udg115.grp 第三组数据: dg6.grp 第四组数据: f14.grp 2.求给定图中的边(或弧)的数目。    实验测试数据基本要求:第一组数据: udg8.grp 第二组数据: udg115.grp 第

    2024年02月08日
    浏览(40)
  • 折半查找实验 (数据结构)

    一、实验目的 掌握折半查找算法的基本思想 掌握折半查找算法的实现方法 掌握折半查找的时间性能 掌握折半查找类的定义和使用 二、实验要求 熟悉C++语言编程 了解折半查找的原理 了解折半查找类的定义、应用 三、实验内容 1、问题描述 在一个有序序列中,折半查找一个

    2024年02月08日
    浏览(83)
  • 【数据结构】实验六:图论

    采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度。 输入格式: 输入第一行中给出2个整数i(0i≤10),j(j≥0),分别为图G的顶点数和边数。 输入第二行为顶点的信息,每个顶点只能用一个字符表示。 依次输入j行,每行输入一条边依附的顶点。 输出格式: 依次输出各顶点的

    2024年02月05日
    浏览(41)
  • 【数据结构】实验一:绪论

    实验一  绪论 一、实验目的与要求 1)熟悉C/C++语言(或其他编程语言)的集成开发环境; 2)通过本实验加深对算法时间复杂度的理解; 3)结合具体的问题分析算法时间复杂度。 二、实验内容 设计程序实现统计一个班的学生成绩(学生的人数可以设置3000、5000、8000、1000

    2024年02月15日
    浏览(37)
  • 【数据结构】实验三:链表

    实验三链表 一、实验目的与要求 1 )熟悉链表的类型定义; 2 ) 熟悉链表的基本操作; 3 ) 灵活应用链表解决具体应用问题。 二、实验内容 1 ) 请设计一个单链表的存储结构,并实现单链表中基本运算算法。 编写程序 linklist.cpp 实现单链表的各种基本运算(假设单链表元

    2024年02月05日
    浏览(56)
  • 《数据结构》实验报告七:查找

    1、掌握 查找表 、 动态查找表 、 静态查找表 和 平均查找长度 的概念。 2、掌握线性表中 顺序查找 和 折半查找 的方法。 3、学会 哈希函数 的构造方法, 处理冲突 的机制以及 哈希表的查找 。 说明以下概念 1、顺序查找:         顺序查找又叫 线性查找 ,是最基本的查

    2024年02月06日
    浏览(36)
  • 【数据结构】实验十一:图

    实验十一 图 一、实验目的与要求 1 )掌握图的存储表示与操作实现。 2 )掌握图的连通性及其应用。 二、  实验内容 1. 用邻接表存储一个图形结构,并计算每个顶点的度。 2.  采用深度和广度优先搜索算法,遍历上述这张图,并输出遍历结果。 三、实验结果 1 )请将调试

    2024年02月15日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包