车皮编序问题.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;icout<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)
在仔细看了这是指针的指针。
小结
在这次试验中,我调试了很多次,但是我还是把程序的结果算出来了。
实践是非常重要的。
我觉得老师要给我们一些建议,来解决一个问题。
因为我们没有一个切入点很难去解决问题。
只要我们知道如何去分析问题,就能很好的用程序来解决问题。
但是,往往要发现一个问题的切入点不是那么容易的,要经过像数学模型的分析啊,找规律呀。
我觉得我的分析能力有点薄弱,不懂的去解决问题。
看到实验题目就有点害怕,希望后面能有点改善。
毕竟算法对我们软件开发还是挺重要的。
往往书本的一个例子,看了几天还是不懂。
但是我们仍然要不放弃的去看例子,这样才能慢慢进步。
语言就是靠编程学会的,不是看着书本就能学会的。
我相信每一次实验报告对我都有点进步。
指导老师评议
成绩评定:
指导教师签名:
实验报告说明
实验名称要用最简练的语言反映实验的内容。
如验证某程序、定律、算法,可写成“验证×××”;分析×××。
实验目的目的要明确,要抓住重点,可以从理论和实践两个方面考虑。
在理论上,验证定理、公式、算法,并使实验者获得深刻和系统的理解,在实践上,掌握使用实验设备的技能技巧和程序的调试方法。
一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。
实验环境实验用的软硬件环境(配置)。
实验内容(算法、程序、步骤和方法)这是实验报告极其重要的内容。
这部分要写明依据何种原理、定律算法、或操作方法进行实验,要写明经过哪几个步骤。
还应该画出流程图(实验装置的结构示意图),再配以相应的文字说明,这样既可以节省许多文字说明,又能使实验报告简明扼要,清楚明白。
数据记录和计算指从实验中测出的数据以及计算结果。
结论(结果)即根据实验过程中所见到的现象和测得的数据,作出结论。
小结 对本次实验的体会、思考和建议。
备注或说明可写上实验成功或失败的原因,实验后的心得体会、建议等。
注意:
∙实验报告将记入实验成绩;
∙每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。