数据结构(二)——队列
来源:互联网 发布:淘宝查销售额 编辑:程序博客网 时间:2024/06/05 16:49
一、队列定义:队列是限定在一端进行插入,另一端进行删除特殊线性表。
二、队列基本操作:
- 入队
- 出队
三、队列例题:
1.例1:舞伴配对问题:
分析:这一题是一道经典的取模运算,每一次将编号往前加一位,到达n就取模。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int main(){ int i,j,k,n,m; scanf("%d%d%d",&m,&n,&k); int a=1,b=1; while(k>0){ printf("%d %d\n",a,b); a%=m;b%=n;a++;b++; k--; } return 0;}
2.集合的前N个元素:编一个程序,按递增次序生成集合M的最小的N个数,M的定义如下:
(1)数1属于M;
(2)如果X属于M,则Y=2*x+1和Z=3*x+1也属于M;
(3)此外再没有别的数属于M。
分析:这一题可以用两个数组来存放有Y和Z产生而出的元素,再通过对比选出小的输出:
#include<stdio.h>int a[100001],b[100001];int main(){ int i,j,k,n,m; int x=1; int ra=0,rb=0,la=1,lb=1; scanf("%d",&n); while(n>0){ printf("%d\n",x); a[++ra]=x*2+1;b[++rb]=x*3+1; if(a[la]>b[lb])x=b[lb++]; else if(a[la]<b[lb])x=a[la++]; else{ x=a[la++];lb++; } n--; } return 0;}
3.约瑟夫问题(小型数据):
分析:这一题可以使用链式存储结构,当你删除一个位置时,把后继为它的后继改为删除位置的后继即可:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int a[100001];int main(){ int i,j,k,n,m; scanf("%d%d",&n,&m); for(i=1;i<n;i++)a[i]=i+1; a[n]=1;j=1; while(n>0){ n--; int js=1; while(js<m){ js++;j=a[j]; } printf("%d\n",a[j]); a[j]=a[a[j]]; } return 0;}
4.细胞个数问题:
分析:其实这一题与队列并没有什么太大的关系,出题人可能是想通过广搜的方式来解决,但完全不要用广搜!
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>char s[1001][1001];int a[1001][1001];int main(){ int i,j,k,n,m,ans=0; scanf("%d%d\n",&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%c",&s[i][j]); a[i][j]=s[i][j]-'0'; } if(i!=n)scanf("\n"); } for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(a[i][j] && !a[i-1][j] && !a[i][j-1])ans++; printf("%d\n",ans); return 0;}/*4 100234500067103456050020456006710000000089*/
5.最少步数
分析:这一题才是真正的广搜,我们通过建立状态来新建数据节点,马有8种方式,象有4种方式,所以这就是一道模版题目啊!
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int a[100001],c[100001];int b[101][101];int ans[100001];int wa1[9]={0,-2,-1,1,2,-2,-1,1,2};int lk1[9]={0,-1,-2,-2,-1,1,2,2,1};int wa2[5]={0,-2,2,-2,2};int lk2[5]={0,-2,-2,2,2};void bfs(int x,int y){ int head=0,tail=1; int i,j,k; a[tail]=x;c[tail]=y;ans[tail]=0; b[x][y]=1; while(head<tail){ head++; for(k=1;k<=8;k++){ int ts=a[head]+wa1[k],ts1=c[head]+lk1[k]; if(b[ts][ts1])continue; b[ts][ts1]=1; a[++tail]=ts;c[tail]=ts1;ans[tail]=ans[head]+1; if(ts==1 && ts1==1){ printf("%d\n",ans[tail]);return; } } for(k=1;k<=4;k++){ int ts=a[head]+wa2[k],ts1=c[head]+lk1[k]; if(b[ts][ts1])continue; b[ts][ts1]=1; a[++tail]=ts;c[tail]=ts1;ans[tail]=ans[head]+1; if(ts==1 && ts1==1){ printf("%d\n",ans[tail]);return; } } } } int main(){ int i,j,k,n,m,x,y; scanf("%d%d%d%d",&n,&m,&x,&y); bfs(n,m); memset(b,0,sizeof(b)); bfs(x,y); return 0;}
阅读全文
0 0
- 数据结构(二)——队列
- 数据结构 - 队列(二)
- 数据结构——队列的使用(二)
- 【数据结构】——-栈、队列和数组(二)
- 数据结构与算法(15)——队列习题二
- 数据结构:循环队列(二)
- 【数据结构】优先级队列(二)
- 队列 数据结构作业(二)
- 数据结构之队列(二)
- 数据结构Java实现——②队列-->队列的“奇葩”二 优先级队列
- 数据结构实验二——栈和队列
- 数据结构算法代码实现——栈和队列(二)
- 数据结构——队列
- 数据结构——队列
- 数据结构——队列
- 数据结构——队列
- 数据结构——队列
- 数据结构——队列
- 关闭CentOS7的firewalld并启用iptables操作
- Web.xml配置详解之context-param
- 51nod1355 斐波那契的最小公倍数
- 动态规划——openjudge7624山区建小学
- vbscript管理磁盘文档目录
- 数据结构(二)——队列
- 架构和设计有什么区别?
- 环形单链表的约瑟夫问题
- tensorflow中tf.maximum,tf.minimum,tf.argmax,tf.argmain的对比
- linux内核移植
- GreenDao的简单使用
- HDU4734[F(x)]
- 穷举法&在给定一组字符中随机抽取字符的方法
- 本地对象的常用几种方法