串、数组、广义表

  • XDOJ0224 矩阵相乘
  • XDOJ0250 螺旋填数
  • XDOJ0257 公共子串
  • XDOJ0287 求矩阵中的马鞍点
  • XDOJ0288 求一个顺序串的next函数值
  • XDOJ0296 中心对称的字符串
  • XDOJ0309 矩阵加法运算

懒。

XDOJ0224 矩阵相乘

//xdoj0224.cpp
#include<cstdio>
using namespace std;
//A矩阵2行3列,B矩阵3行2列
int** MartixMultiply(int A[][3],int B[][2],int r,int c){​int **C=new int*[r];for(int i=0;i<r;++i){C[i]=new int[c];}
​for(int i=0;i<r;++i){for(int j=0;j<c;++j){C[i][j]=0;for(int k=0;k<c;++k){C[i][j]+=A[i][k]*B[k][j];}}}return C;
}
int main(){int A[2][3];int B[3][2];for(int i=0;i<2;++i){for(int j=0;j<3;++j){scanf("%d",&A[i][j]);}}for(int i=0;i<3;++i){for(int j=0;j<2;++j){scanf("%d",&B[i][j]);}}
​int** C=MartixMultiply(A,B,2,3);
​for(int i=0;i<2;++i){for(int j=0;j<2;++j){printf("%d ",C[i][j]);}printf("\n");}return 0;
}

XDOJ0250 螺旋填数

//xdoj0250.cpp
//xdoj0250.c
#include<stdio.h>
int main(){int nums[100][100]={0},n,m,count=1,r=0,c=0;scanf("%d%d",&n,&m);int total=n*m;//四个边界 Right Left Up Downint Rlimit=m,Llimit=0,Ulimit=0,Dlimit=n;
​//理解为n次螺旋填数,每次填完,边界缩小while(count<=total){while(c<Rlimit){nums[r][c++]=count++;}c--;r++;
​while(r<Dlimit){nums[r++][c]=count++;}r--;c--;
​while(c>=Llimit){nums[r][c--]=count++;}c++;r--;
​while(r>Ulimit){nums[r--][c]=count++;}r++;c++;
​//每次螺旋之后,边界缩小Rlimit--;Llimit++;Ulimit++;Dlimit--;}
​//输出for(int i=0;i<n;i++){for(int j=0;j<m;j++){printf("%d ",nums[i][j]);}printf("\n");}
​return 0;
}

XDOJ0257 公共子串

//xdoj0257.cpp
//最长公共子串,并计算相似度
/*  注意有空格输入,他妈的s h i t o
m   0 0 0 0 0
i   0 0 1 0 0
t   0 0 0 2 0
m   0 0 0 0 0
i   0 0 1 0 0
t   0 0 0 2 0
o   0 0 0 0 3
LCS等价于max,每次给矩阵赋值就刷新一下
*/
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int main(){int Martix[100][100];int LCS=0;string S1;string S2;getline(cin,S1);getline(cin,S2);int l1=S1.length();int l2=S2.length();for(int i=0;i<l1;++i){if(S1.at(i)>=65 && S1.at(i)<=90){S1.at(i)+=32;//是大写字母就改为小写}}for(int i=0;i<l2;++i){if(S2.at(i)>=65 && S2.at(i)<=90){S2.at(i)+=32;//是大写字母就改为小写}}for(int i=0;i<l2;++i){//i操作s2for(int j=0;j<l1;++j){//j操作s1if(S2.at(i)==S1.at(j)){//字符匹配上了if(i==0||j==0){//如果是矩阵的边界,则直接赋值1Martix[i][j]=1;
​if(LCS<Martix[i][j]){LCS=Martix[i][j];//刷新最大值}}else{//对角线加1Martix[i][j]=Martix[i-1][j-1]+1;
​if(LCS<Martix[i][j]){LCS=Martix[i][j];//刷新最大值}}}else{//不一样Martix[i][j]=0;}}}cout<<LCS<<endl;//记得三位小数printf("%.3lf",2*(double)LCS/(l1+l2));
​return 0;
}

XDOJ0287 求矩阵中的马鞍点

//xdoj0287.cpp
#include<iostream>
#include<vector>
#include<cstdlib>
using namespace std;
//min: 2 0 8 4
//max: 8 23 13 18
typedef struct Node{int i,j,value;
}Node;
int main(){int n,m,input[100][100],i=0,j=0,flag=0;//i,j操作,flag标记是否有马鞍点,默认没有vector<Node>min;vector<Node>max;Node* t=(Node*)malloc(sizeof(Node));//临时结点t,用于存贮三元组//输入部分 m是行,n是列,但是xdoj给的不清不楚,纯sbcin>>m>>n;for(i=0;i<m;++i){for(j=0;j<n;++j){cin>>input[i][j];}}//先按行查找每一行的最小值,把每一行的最小值入minfor(i=0;i<m;++i){t->value=input[i][0];t->i=i+1;//在这里赋值,防止第一个就是最小值,导致ij未赋值for(j=1,t->j=j;j<n;++j){//t->j=j,不用加一,因为j赋值为1了if(t->value>input[i][j]){t->value=input[i][j];t->i=i+1;t->j=j+1;}}min.push_back(*t);}//再按列查找每一列的最大值,把每一列的最大值入maxfor(i=0;i<n;++i){t->value=input[0][i];t->j=i+1;//在这里赋值,防止第一个就是最大值,导致ij未赋值for(j=1,t->i=j;j<m;++j){if(t->value<input[j][i]){t->value=input[j][i];t->i=j+1;t->j=i+1;//注意这里反了一下}}max.push_back(*t);}//优先行来找马鞍点,也就是min先遍历,先遍历的在内层循环for(i=0;i<max.size();++i){//i操作max,j操作minfor(j=0;j<min.size();++j){if(min.at(j).i==max.at(i).i && min.at(j).j==max.at(i).j && min.at(j).value==max.at(i).value){//结点相同,则符合马鞍点的定义cout<<min.at(j).i<<' '<<min.at(j).j<<' '<<min.at(j).value<<endl;flag=1;//输出过,说明有马鞍点}}}if(flag==0){cout<<"NO";}return 0;
}

XDOJ0288 求一个顺序串的next函数值

//xdoj0288.cpp
#include<iostream>
using namespace std;
//注意下面这个next函数是根据一般的情况来的,也就是从1数起,第一二个固定是0,1
//题目是从0数,第一二个固定是-1,0,只要最后输出减一就行了
void Next(char* T,int* next,int Tlength){next[1]=0;next[2]=1;int i=2;int j=1;while(i<Tlength){if(j==0||T[i-1]==T[j-1]){++i;++j;next[i]=j;}else{j=next[j];}}
}
​
int main(){int n,next[100];char T[100];cin>>n;for(int i=0;i<n;++i){cin>>T[i];}Next(T,next,n);for(int i=1;i<=n;++i){cout<<next[i]-1<<' ';}return 0;
}

XDOJ0296 中心对称的字符串

//xdoj0296.cpp
#include<iostream>
using namespace std;
int main(){int n;char str[100];cin>>n;for(int i=0;i<n;++i){cin>>str[i];}int i=0,j=n-1;while(i<n/2){if(str[i++]!=str[j--]){cout<<"NO";return 0;}}cout<<"YES";return 0;
}

XDOJ0309 矩阵加法运算

//xdoj0309.cpp
#include<iostream>
#include<list>
#include<cstdlib>
using namespace std;
typedef struct Node{int x,y,v;
}Node;
list<Node>B1;
list<Node>B2;
list<Node>B;
​
void MartixAdd(){//B用于存储结果 按照行小的先压入, 总体分为行相等,行1大,行2大list<Node>::iterator p1=B1.begin();list<Node>::iterator p2=B2.begin();
​while(p1!=B1.end() && p2!=B2.end()){//遍历俩个链表if(p1->x==p2->x){if(p1->y == p2->y){//坐标相同,实行相加if(p1->v + p2->v == 0){//坐标相同,但是和为0,故无视;}else{//和不为0,压入BNode* s=(Node*)malloc(sizeof(Node));s->x=p1->x;s->y=p1->y;s->v=p1->v+p2->v;B.push_back(*s);}//坐标一样,俩迭代器都后移++p1;++p2;}else if(p1->y > p2->y){//列小的压入B.push_back(*p2);++p2;}else if(p1->y < p2->y){B.push_back(*p1);++p1;}}else if(p1->x > p2->x){//B1结点行比B2当前结点行 大,先入B2的结点B.push_back(*p2);++p2;}else if(p1->x < p2->x){//入p1结点B.push_back(*p1);++p1;}}//while//没完,可能有一个没遍历完if(p1==B1.end() && p2==B2.end()){//都遍历完,则返回return;}else{if(p1==B1.end()){while(p2!=B2.end()){B.push_back(*p2);++p2;}}else if(p2==B2.end()){while(p1!=B1.end()){B.push_back(*p1);++p1;}}return;}
}
​
int main(){int n,m,t;list<Node>::iterator p1;//p1迭代器遍历B1list<Node>::iterator p2;list<Node>::iterator p3;cin>>n>>m;
​//输入部分for(int i=0;i<n;++i){for(int j=0;j<m;++j){cin>>t;if(t==1){Node* s=(Node*)malloc(sizeof(Node));s->x=i;s->y=j;
​B1.push_back(*s);}}}for(p1=B1.begin();p1!=B1.end();p1++){cin>>t;(*p1).v=t;}
​for(int i=0;i<n;++i){for(int j=0;j<m;++j){cin>>t;if(t==1){Node* s=(Node*)malloc(sizeof(Node));s->x=i;s->y=j;
​B2.push_back(*s);}}}for(p2=B2.begin();p2!=B2.end();p2++){cin>>t;(*p2).v=t;}
​//处理部分,相当于俩个链表x,y相同的运算,不同的合并,类似多项式加法MartixAdd();
​p3=B.begin();for(int i=0;i<n;++i){for(int j=0;j<m;++j){if(p3==B.end()){cout<<"0 ";continue;}else{if(i==p3->x&&j==p3->y){cout<<"1 ";++p3;}else{cout<<"0 ";}}}cout<<endl;}p3=B.begin();while(p3!=B.end()){cout<<p3->v<<' ';++p3;}
​return 0;
}

数据结构-串、数组、广义表相关推荐

  1. 数据结构C语言——广义表

    很久没有发博客记录了,不过应该也没人关心这个,哈哈哈. 突然想起来,学习也不能只是干学,稍微做点记录. 之前我对html.css.js基础有了一定的理解,也学了一些模板,不过现在我想先把计算机基础给补 ...

  2. 数据结构14——求广义表深度(严5.30)

    Description 试按表头.表尾的分析方法编写求广义表的深度的递归程序. Input 输入一串以'('开始,以'('结束的字符串,并且输入的左右括号必须匹配,如:(),(())-- Output ...

  3. 西北工业大学NOJ数据结构—014求广义表深度

    #include <stdio.h> #include <stdlib.h>typedef struct Node {int A_L;//使用枚举不熟练,A_T代表Atom或L ...

  4. C语言数据结构-数组广义表-十字链表-实现十字链表的初始化操作-实现十字链表的删除操作

    十字链表 十字链表相关定义如下: typedef int ElemType;// 非零元素结点结构 typedef struct OLNode {int row,col;ElemType value; ...

  5. 数据结构 习题 第五章 多维数组和广义表 (C语言描述)

    最近在复习数据结构,所以想把平时上课做的习题做个总结,如果大家有遇到这方面的问题就可以参考一下了,废话不多说,直接开始吧. 1.单选题 稀疏矩阵一般的压缩存储方法有两种,即( D) A. 二维数组和三 ...

  6. 数据结构之数组与广义表

    目录 联系 数组 广义表 联系 数组和广义表可看作一种扩展的线性数据结构,其特殊性在于数据元素的构成上.从组成线性表的元素角度看,数组是由具有某种结构的数据元素构成,广义表则是由单个元素或子表构成的. ...

  7. 数据结构与算法-Part6——数组与广义表

    目录 一丶数组 1:一维数组 2:二维数组 1)二维数组的概念 2)二维数组的顺序存储结构 3)二维数组的遍历 3:在C#中自定义矩阵类 二丶稀疏矩阵 1:稀疏矩阵的三元组 2:稀疏矩阵三元组集合的顺 ...

  8. 分层次的非线性结构——树(广义表)05

    包含子结构的线性结构,线性表的推广--广义表 广义表的定义 广义表定义 约定:为了区分原子和子表,书写时用大写字母表示子表,用小写字母表示原子. 广义表特性 广义表表示方法 用圆圈和方框分别表示表和单 ...

  9. 【数据结构总结】第四章:串、数组和广义表(线性结构)

    第四章:串.数组和广义表(线性结构) 提示:本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅 ...

  10. 《数据结构》第四章串,数组和广义表

    <数据结构>第四章 文章目录 <数据结构>第四章 4.1 串的定义 4.2 案例引入 4.3 串的类型定义,存储结构及其运算 4.3.1 串的抽象类型定义 4.3.2的存储结构 ...

最新文章

  1. POJ 3415 Common Substrings
  2. 发现一个ps抠毛发简单快捷高质量的方法
  3. 程序猿都在关注的6个优质公众号
  4. (winform)在一个form里面显示google地图
  5. 如何判断模糊图像_深圳企业宣传片拍摄制作教你如何使用手动聚焦
  6. sql server序列_SQL Server中的序列对象功能
  7. 18华工校赛 小马哥的超级盐水 折半枚举
  8. java医院门诊管理系统
  9. 简单FTP服务器搭建教程
  10. 中兴b860刷机运行Linux,全国各地中兴B860A刷机越狱全贴(2016年2月26日更新)
  11. 微信小程序登录小实例
  12. 数控技术 - 直线插补 - 逐点比较法
  13. SpringBoot及SpringCloud版本管理(Gradle版本)
  14. linux系统忘记密码之破解密码
  15. python 当天零点的时间戳
  16. 升级safari 12版本,easyconnectplugin插件等不能使用解决办法
  17. cannt connect to db!_分贝db以及在语音的用途
  18. 揭秘霸王龙如何捕食三角龙:先斩首后享用(图)
  19. 微信端权限控制java,微信支付:特约子商户商户号未授权服务商的产品权限 的解决方案...
  20. RJ TextEd 中文绿色版下载

热门文章

  1. 61850协议服务器端开发,IEC61850报告服务端开发.doc
  2. GRUB Error 28: Selected item cannot fit into memory
  3. addEventLinstener与attachEvent区别、兼容性问题
  4. 商品信息管理系统(Python)完整版
  5. Linux下编译so文件
  6. Java停止线程的3种方式
  7. 计算机毕业设计 SSM网上购物商城系统(源码+论文)
  8. 软件测试用户故事评审实验报告,手把手教你写用户故事验收标准
  9. 宝塔面板配置及部署javaweb教程(全网最全)
  10. UBOOT学习1——UBOOT移植流程