车皮编序问题.docx

上传人:b****7 文档编号:10777737 上传时间:2023-02-22 格式:DOCX 页数:10 大小:87.37KB
下载 相关 举报
车皮编序问题.docx_第1页
第1页 / 共10页
车皮编序问题.docx_第2页
第2页 / 共10页
车皮编序问题.docx_第3页
第3页 / 共10页
车皮编序问题.docx_第4页
第4页 / 共10页
车皮编序问题.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

车皮编序问题.docx

《车皮编序问题.docx》由会员分享,可在线阅读,更多相关《车皮编序问题.docx(10页珍藏版)》请在冰豆网上搜索。

车皮编序问题.docx

车皮编序问题

实验报告

课程名称

数据结构与算法设计 

实验课时

4

实验项目

实验三栈

实验时间

2013-4-7

实验目的

1、栈的基本运算

2、对算法的时间复杂性进行分析

实验环境

1、机房3

2、VisualC++6.0 

实验内容(算法、程序、步骤和方法)

算法实验题3.1车皮编序问题

实验任务:

给定正整数n,计算左边轨道车皮编号问题依次为1,2,3…….,n时,在右边轨道最多可以得几个不同的车皮编序方案。

例如当n=3时,最多得到5组不同的编序方案如下:

123

132

213

231

321

#include

usingstd:

:

endl;

usingstd:

:

cin;

usingstd:

:

cout;

int*N;

typedefstructSqStack

{

int*base;

int*top;

intsize;

}Sq,*S;

boolPop(S,int&);

boolPush(Ss,int*values_len);

boolDeleteStack(S);

boolinitial(S,constint&);

voidPrint(intn);

//移位

boolmove(constint&value,int*values_len,constint);

intPcs_accord(int*,int);//是否符合个数和符合条件

boolPop_Push(S,int*);

intmain()

{

unsignedintA=0xAAAAAAAA,B=0xFFFFFFFF;

intn,temp;

intcount=0;

int*values_len;

Ss;

cin>>n;

N=newint[n];

values_len=newint[2*n];

A>>=32-2*n;

B>>=32-n;

B<<=n;

s=newSq;

initial(s,n);

for(temp=A;temp<=B;temp++)

{

move(temp,values_len,n);

if(Pcs_accord(values_len,n)==n)//计算个数

{

if(Pop_Push(s,values_len)==false)

continue;

else

count++;

}

else

continue;

Print(n);

}

cout<

return0;

}

voidPrint(intn)

{

for(inti=0;i

cout<

cout<

}

boolinitial(Ss,constint&n)

{

s->base=newint[2*n+1];

s->top=s->base;

s->size=2*n;

if(s->base!

=NULL)

returntrue;

else

returnfalse;

}

/*出栈*/

boolPop(Ss,int&e)

{

if(s->top==s->base)

returnfalse;

else

e=*(--s->top);

returntrue;

}

/*进栈*/

boolPush(Ss,inte)

{

*(s->top)++=e;

returntrue;

}

boolDeleteStack(Ss)

{

if(*s->base!

=0)

{

delete[]s->base;

returntrue;

}

else

returnfalse;

}

boolmove(constint&value,int*values_len,constintn)

{

inti=2*n-1;

inttemp=0;

intT=n-1;

intV=value;

while(V)

{

temp=V&1;

V>>=1;

if(temp!

=0)

values_len[i--]=temp+T--;

else

values_len[i--]=temp;

}

returntrue;

}

//计算个数

intPcs_accord(int*B,intn)

{

intcount=0;

if(B[2*n-1]!

=0)

return0;

else

for(inti=0;i<2*n;i++)

{

if(B[i]==0)

count++;

else

continue;

if(count>n)

return0;

}

if(count==n)

returncount;

else

return0;

}

boolPop_Push(Ss,int*elen)

{

boolB=false;

intn=0;

inte;

for(inti=0;isize;i++)

{

if(elen[i]!

=0)//进栈

B=Push(s,elen[i]);

else

{

B=Pop(s,e);//出栈

N[n++]=e;

}

if(B==false)

returnfalse;

}

returntrue;

}

数据记录

和计算

数据一:

这是当n=3时,数据结果如下 

数据二:

这是当n=4时,数据结果如下 

数据三:

这是当n=6时,数据结果如下 

数据四:

这是当n=9时,数据结果如下 

结论

(结果)

当二进制满足栈底的数为0且进栈的数目等于出栈数目(意思是1的个数和0的个数呀相等,但是当n=4时,二进制10101001虽然有满足进栈的数目等于出栈数目,但是还是不符合要求要进行加以判断),把满足条件的存储到另一个栈(若二进制为1时进栈,为0时出栈)经过进出栈的判断,我们可以得到不同的方案。

根据

这个公式以上的数据结果方案的个数是相等的。

该程序如n=4,二进制是以10101010开始的,以11110000结束的,这样大大缩短了程序的计算时间。

但是还是可以加以优化,奇数的二进制可以跳过不算,只算范围内的偶数二进制数。

但是由于有点难度,该程序没有实现。

范围大的还是不可以算的,有点缺点。

在试验中if(*s->base!

=NULL)这行代码写成了if(s->base!

=nullptr)

在仔细看了这是指针的指针。

小结

在这次试验中,我调试了很多次,但是我还是把程序的结果算出来了。

实践是非常重要的。

我觉得老师要给我们一些建议,来解决一个问题。

因为我们没有一个切入点很难去解决问题。

只要我们知道如何去分析问题,就能很好的用程序来解决问题。

但是,往往要发现一个问题的切入点不是那么容易的,要经过像数学模型的分析啊,找规律呀。

我觉得我的分析能力有点薄弱,不懂的去解决问题。

看到实验题目就有点害怕,希望后面能有点改善。

毕竟算法对我们软件开发还是挺重要的。

往往书本的一个例子,看了几天还是不懂。

但是我们仍然要不放弃的去看例子,这样才能慢慢进步。

语言就是靠编程学会的,不是看着书本就能学会的。

我相信每一次实验报告对我都有点进步。

指导老师评议

 

 

成绩评定:

指导教师签名:

实验报告说明

实验名称要用最简练的语言反映实验的内容。

如验证某程序、定律、算法,可写成“验证×××”;分析×××。

实验目的目的要明确,要抓住重点,可以从理论和实践两个方面考虑。

在理论上,验证定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的技能技巧和程序的调试方法。

一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。

实验环境实验用的软硬件环境(配置)。

实验内容(算法、程序、步骤和方法)这是实验报告极其重要的内容。

这部分要写明依据何种原理、定律算法、或操作方法进行实验,要写明经过哪几个步骤。

还应该画出流程图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明,又能使实验报告简明扼要,清楚明白。

数据记录和计算指从实验中测出的数据以及计算结果。

结论(结果)即根据实验过程中所见到的现象和测得的数据,作出结论。

小结 对本次实验的体会、思考和建议。

备注或说明可写上实验成功或失败的原因,实验后的心得体会、建议等。

注意:

∙实验报告将记入实验成绩;

∙每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1