车皮编序问题.docx
- 文档编号:10777737
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:10
- 大小:87.37KB
车皮编序问题.docx
《车皮编序问题.docx》由会员分享,可在线阅读,更多相关《车皮编序问题.docx(10页珍藏版)》请在冰豆网上搜索。
车皮编序问题
实验报告
课程名称
数据结构与算法设计
实验课时
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;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) 在仔细看了这是指针的指针。 小结 在这次试验中,我调试了很多次,但是我还是把程序的结果算出来了。 实践是非常重要的。 我觉得老师要给我们一些建议,来解决一个问题。 因为我们没有一个切入点很难去解决问题。 只要我们知道如何去分析问题,就能很好的用程序来解决问题。 但是,往往要发现一个问题的切入点不是那么容易的,要经过像数学模型的分析啊,找规律呀。 我觉得我的分析能力有点薄弱,不懂的去解决问题。 看到实验题目就有点害怕,希望后面能有点改善。 毕竟算法对我们软件开发还是挺重要的。 往往书本的一个例子,看了几天还是不懂。 但是我们仍然要不放弃的去看例子,这样才能慢慢进步。 语言就是靠编程学会的,不是看着书本就能学会的。 我相信每一次实验报告对我都有点进步。 指导老师评议 成绩评定: 指导教师签名: 实验报告说明 实验名称要用最简练的语言反映实验的内容。 如验证某程序、定律、算法,可写成“验证×××”;分析×××。 实验目的目的要明确,要抓住重点,可以从理论和实践两个方面考虑。 在理论上,验证定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的技能技巧和程序的调试方法。 一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。 实验环境实验用的软硬件环境(配置)。 实验内容(算法、程序、步骤和方法)这是实验报告极其重要的内容。 这部分要写明依据何种原理、定律算法、或操作方法进行实验,要写明经过哪几个步骤。 还应该画出流程图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明,又能使实验报告简明扼要,清楚明白。 数据记录和计算指从实验中测出的数据以及计算结果。 结论(结果)即根据实验过程中所见到的现象和测得的数据,作出结论。 小结 对本次实验的体会、思考和建议。 备注或说明可写上实验成功或失败的原因,实验后的心得体会、建议等。 注意: ∙实验报告将记入实验成绩; ∙每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 车皮 问题