文章目录
稀疏矩阵的转置
已知用三元组顺序表存储的稀疏矩阵ma,求这个矩阵的转置mb
输入要求
第一行输入三个整数mu, nu, tu,分别代表输入矩阵ma的行数、列数和非零元素的个数(0<mu<=1000000, 0<nu<=1000000, 0<=tu<=10)
接下来的tu行,每行输入一个三元组。
数据按行的升序输入,相同行的数据按列的升序输入。见样例输入。
6 7 8
1 2 12
1 3 9
3 1 -3
3 6 14
4 3 24
5 2 18
6 1 15
6 4 -1
输出要求
转置矩阵mb的三元组顺序表。
数据按行的升序输出,相同行的数据按列的升序输数。见样例输出。
7 6 8
1 3 -3
1 6 15
2 1 12
2 5 18
3 1 9
3 4 24
4 6 -1
6 3 14
用冒泡排序
代码
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef struct{
int i;//矩形行数
int j;//矩形列数
int e;//该区域值
}Rectangle;
void transfer(Rectangle ma[],Rectangle mb[]){
for(int i = 1;i < ma[0].e;i++){
for(int j = 1;j <= ma[0].e-i;j++){
if(ma[j].j > ma[j+1].j){
Rectangle temp = ma[j];
ma[j] = ma[j+1];
ma[j+1] = temp;
}
}
}
for(int i = 1;i < ma[0].e;i++){
for(int j = 1;j <= ma[0].e-i;j++){
if(ma[j].j == ma[j+1].j && ma[j].i > ma[j+1].i){
Rectangle temp = ma[j];
ma[j] = ma[j+1];
ma[j+1] = temp;
}
}
}
mb[0].e = ma[0].e;mb[0].i = ma[0].j;mb[0].j = ma[0].i;
for(int i = 1;i <= mb[0].e;i++){
mb[i].i = ma[i].j;
mb[i].j = ma[i].i;
mb[i].e = ma[i].e;
}
}
void createRectangle(Rectangle ma[]){
for(int i = 1;i <= ma[0].e;i++){
scanf("%d %d %d",&ma[i].i,&ma[i].j,&ma[i].e);
}
}
int main(){
Rectangle ma[MAXSIZE];
Rectangle mb[MAXSIZE];
scanf("%d %d %d",&ma[0].i,&ma[0].j,&ma[0].e);
createRectangle(ma);
transfer(ma,mb);
for(int i = 0;i <= ma[0].e;i++){
printf("%d %d %d\n",mb[i].i,mb[i].j,mb[i].e);
}
}
字符串匹配-KMP算法
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXS 80
typedef struct{
char *ch;
int length;
} HString; // 堆式顺序存储
void createString(HString &S){
S.ch = new char[MAXS];
gets(S.ch+1);
S.length = strlen(S.ch+1);
}
// 使用 KMP 算法进行模式匹配,字符比较次数
int charCompKMP(HString S, HString T){
// 使用 KMP 算法进行模式匹配,字符比较次数
int charCompKMP(HString S, HString T){
//当前位置的最长前缀
int t = 0;
int count = 0;
int j = 1;
int next[T.length+1];
//next记录的当前不匹配时返回比较主串的位置
next[1] = 0;
//计算next[]
while(j < T.length){
/*如果最长前缀的后一位和当前位置相等,说明可以更新最长前缀,t=0时说明当前被对比的字符已经与对比的字符串中第一个对比过了,并且还是不匹配,所以此时都往后退一个*/
if(t == 0 || T.ch[t] == T.ch[j]){
next[j+1] = t+1;
t++;
j++;
}
//否则,跟kmp匹配原理一样,找next前缀
else{
t = next[t];
}
}
for(int i = 1,j = 1;i <= S.length && j <= T.length;){
count++;
if(j == 0 || S.ch[i] == T.ch[j]){
if(j == 0) count--;
i++;
j++;
}else{
j = next[j];
}
if(j == T.length+1) break;
}
return count;
}
int main(){
HString S, T;
createString(S);
createString(T);
int num = charCompKMP(S, T);
printf("%d", num);
}