数据结构问题Word格式文档下载.docx
- 文档编号:16112323
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:9
- 大小:61.74KB
数据结构问题Word格式文档下载.docx
《数据结构问题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构问题Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
//用于交换
while(p!
=null){
k++;
//计量链表的元素个数
p=p.nextNode;
p=q;
for(i=0;
i<
k-1;
i++){//用一个双层循环对链表进行排序
for(j=0;
j<
k-i-1;
j++){
if(p.data>
p.nextNode.data){
t=p.data;
p.data=p.nextNode.data;
p.nextNode.data=t;
测试结果
简单约瑟夫环:
问题描述
罗马人攻占了乔塔帕特,41个人藏在山洞中,其中包括约瑟夫和他的一个朋友。
而此时另外39个人为了表示忠贞准备集体自杀,他们约定41个人围成一个圈,由第一个人开始顺时针报数,每报数为3的人就立刻自杀,然后由下一个人重新报数,依次类推,直到所有人都死亡…….但最后约瑟夫和他的朋友却躲过了一劫,请问他们在圈中的原始位置。
解题思路
我们分析一下就可以得到,到最后的两个人时只要只剩下约瑟夫和他的朋友就可以了。
那么如何达到目的呢:
一个明显的求解的方法就是将41个人排成一个环,内圈为按照顺时针的最初编号,外圈为每个人数到数字3的顺序,我们可以使用数组来保存约瑟夫环中该自杀的数据,而数组的下标作为参与人员的编号,并将数组看做环形来处理。
源码
这里只给出关键的处理函数,测试的主方法用户可以自行编写:
/*在while里面嵌套一个do-while;
在do-while里面执行杀人的准备,
*每计数到三就跳出一次循环,打印语句,并将对应的man数组值设为约瑟夫编号
**/
staticvoidJosephus(intalive){//约瑟夫方法,alive为要存活的人数
//约瑟夫编号,如果没被杀死,值为0;
杀死了之后值为约瑟夫编号,即第几个被杀死的
int[]man=newint[Num];
//声明为数组,Java的特性,全部被初始化为0;
inti=0;
//用于计数口号,为3则杀掉
intcount=0,pos=0;
//计数器和计量位置的下标
while(count<
Num-alive){
do{
pos=(pos+1)%Num;
//
if(man[pos]==0){
i++;
//未被砍,i加1;
if(i==KillMan){
i=0;
break;
//要死人了,跳出do-while;
}while(true);
count++;
man[pos]=count;
//赋值给数组,表示是第几个被杀死的;
System.out.println("
No."
+pos+"
Died!
"
+"
HisJosephusnumberis"
+man[pos]);
//表示这个人已经死了;
System.out.println();
//找到幸存者编号
pos=0;
while(pos<
Num){
if(man[pos]==0)
Onepositionis"
+pos);
pos++;
需要两个人存活,所以这里输入2:
复杂约瑟夫环
n个人环坐一圈,按照顺时针方向依次编号为1、2、3、…..、n。
有一个黑盒子里放置着许多的字条,其上写有随机的数字。
每个人随机取一个字条,上面的对应数字即为出列数字。
游戏开始时,任选一个处理数字M,从第一个人开始,按编号顺序自1开始顺序报数,报到m的人出列,同时将手中的数字作为新的出列数字。
然后从下一个人开始重新从1开始报数,如此循环下去,直至最后一人。
分析思路
这里和前面的思路类似,只是我们要注意两个问题:
-----由于这里的n是可变的,不能用数组表示,应该用链表。
另外n个人首尾相接,应该使用循环链表。
-----出列数字不是固定的,每个人都有不同的值,这里应该单独处理。
处理源码
packagecom.Test;
importjava.util.Scanner;
/*
*解决简单的约瑟夫环问题
**/
publicclasstest{
staticScannerIN=newScanner(System.in);
staticLinkListhead=null,tail=null;
//链表的头指针和尾指针
intsize=0;
publicstaticvoidmain(String[]args){
testt=newtest();
inte,baoshu;
//初次报数号
Inputthenumberintherings:
"
);
intnum=IN.nextInt();
//输入约瑟夫环人数
AccordingtheorderinputtheOutputLineNumber:
e=IN.nextInt();
t.addHead(1,e);
for(inti=2;
=num;
i++){
t.addTail(i,e);
InputthefirstonetoOutput!
baoshu=IN.nextInt();
Josephus(head,baoshu);
//求解复杂约瑟夫环
/*
*思路:
逐个计数啊,到谁谁就出列;
*然后重置出列数,从下一个开始计数,直到剩下最后一个人(p.next=p)
**/
staticvoidJosephus(LinkListhead,intm){//约瑟夫方法,alive为要存活的人数
LinkListq,p;
inti;
q=p=head;
while(q.next!
=p){
q=q.next;
while(p.next!
=p){//循环的终止的条件就是只剩一个人;
for(i=0;
m-1;
q=p;
p=p.next;
q.next=p.next;
//删除p指向的节点
//一组循环完后,一人出列;
Thenumber"
+p.no+"
isout!
Hisnumberis"
+p.psw);
m=p.psw;
//将出列号设为出列人的出列号
p=null;
p=q.next;
//从下一个人开始继续计数
Thelastoneis:
+p.no+"
!
publicvoidaddHead(inti,intpsw){
head=newLinkList(i,psw,head);
if(tail==null)
tail=head;
size++;
publicvoidaddTail(inti,intpsw){
tail.next=newLinkList(i,psw);
tail=tail.next;
tail.next=head;
城市的最短总距离
求解一个城市群间的最短总距离,即要求遍历所有城市的最短距离。
算法解析
问题也即在图论中求解最小生成树:
(1)、将图中所有顶点的集合记为V,最小生成树中的顶点集合为U。
初始时,V中包含所有顶点,而U为空。
(2)、首先从V集合中取出一个顶点(设为V0),将其加入到集合U中。
(3)、从V0的邻接点钟选择点Vn,使(V0,Vn)边的权值最小,得到最小生成树的一条边。
将Vn点加入集合U.
(4)、接着从V-U集合中再选出一个与V0,Vn邻接的顶点,找出权值最小的一条边。
得到最小生成树的另一条边。
将该顶点加入结合U。
(5)、按上述步骤不断重复,最后便可以得到该图的最小生成树。
源代码
publicstaticvoidmain(String[]args)throwsException{
staticvoidPrimGraph(GraphMatrixGM){//最小生成树算法
inti,j,k,min,sum;
int[]weight=newint[GraphMatrix.MaxNum];
char[]vtempx=newchar[GraphMatrix.MaxNum];
//保留顶点信息
sum=0;
for(i=1;
GM.VertextNum;
weight[i]=GM.EdgeWeight[0][i];
if(weight[i]==MaxValue){
vtempx[i]=(char)NoL;
vtempx[i]=GM.Vertex[0];
//邻接顶点
vtempx[0]=USED;
//选用
weight[0]=MaxValue;
min=weight[0];
k=i;
for(j=1;
j<
=GM.VertextNum;
if(weight[j]<
min&
&
vtempx[j]>
0){//找到权值更小的未使用边
min=weight[i];
//保存权值
k=j;
//保存邻接点序号
sum+=min;
System.out.println(vtempx[k]+"
+GM.Vertex[k]);
//输出生成树的一条边
vtempx[k]=USED;
weight[k]=MaxValue;
j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 问题