迷宫问题哈夫曼编码排序课设代码.docx
- 文档编号:9629185
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:36
- 大小:21.05KB
迷宫问题哈夫曼编码排序课设代码.docx
《迷宫问题哈夫曼编码排序课设代码.docx》由会员分享,可在线阅读,更多相关《迷宫问题哈夫曼编码排序课设代码.docx(36页珍藏版)》请在冰豆网上搜索。
迷宫问题哈夫曼编码排序课设代码
附录
附录1
迷宫问题程序代码:
头文件:
#include
#include
#include
#include
usingnamespacestd;
#defineMAXSIZE100
usingnamespacestd;
typedefstruct{
intx;
inty;
}Item;
typedefstruct{//定义各点数据类型,x和y表示坐标,d表示方向
intx,y,d;
}DataType;
typedefstruct{//栈
DataTypedata[MAXSIZE];
inttop;
}Seqstack;
Seqstack*init_Seqstack();
intEmpty_Seqstack(Seqstack*);//判断栈是否为空
intPush_Seqstack(Seqstack*,DataType);//入栈算法
intPop_Seqstack(Seqstack*,DataType&);//出栈算法
intOutput(Seqstack*,int,int);//输出路径
intPath(intmaze[MAXSIZE][MAXSIZE],Itemmove[],int,int);//计算路径
函数文件:
#include"migong.h"
Seqstack*init_Seqstack(){
Seqstack*s;
s=newSeqstack;
s->top=-1;
if(!
s){
cout<<"空间不足"< returnNULL; } else{ s->top=-1; returns; } } //判空 intEmpty_Seqstack(Seqstack*s){ if(s->top==-1) return1; else return0; } //入栈算法 intPush_Seqstack(Seqstack*s,DataTypex){ if(s->top==MAXSIZE-1) return0; else{ s->top++; s->data[s->top].x=x.x; s->data[s->top].y=x.y; s->data[s->top].d=x.d; return1; } } //出栈算法 intPop_Seqstack(Seqstack*s,DataType&x){ if(Empty_Seqstack(s)) return0; else{ x=s->data[s->top]; s->top--; return1; } } //输出路径 intOutput(Seqstack*s,introw,intline){ inti=s->top; cout<<"("< while(i! =-1){ cout<<"("< i--; } cout< return1; } intPath(intmaze[MAXSIZE][MAXSIZE],Itemmove[],introw,intline){ Seqstack*s=init_Seqstack(); DataTypetemp; intx=1,y=1,d,j,i,k=0; temp.x=1; temp.y=1; temp.d=-1; Push_Seqstack(s,temp); while(! Empty_Seqstack(s)) { maze[x][y]=0; if(x==1&&y==1){ maze[1][1]=-1; } Pop_Seqstack(s,temp); x=temp.x; y=temp.y; d=temp.d+1; while(d<4){ i=x+move[d].x; j=y+move[d].y; if(maze[i][j]==0){ temp.x=x; temp.y=y; temp.d=d; Push_Seqstack(s,temp); x=i; y=j; maze[x][y]=-1; if(x==row&&y==line){ cout<<"第"< "< Output(s,row,line); k++; break; } else d=0; } else d++; } } returnk; } 测试文件: #include"migong.h" intmain(){ introw;//迷宫的行数 intline;//迷宫的列数 inta,p=0; cout<<"欢迎进入迷宫系统"< while (1){ Itemmove[4]={{-1,0},{0,1},{1,0},{0,-1}};//定义各方向移动数组 cout<<"请选择是否进入迷宫: "< cout<<"1.进入2.不进入"< cin>>a; switch(a){ case1: inti,j; cout<<"请依次输入迷宫的行和列"< cin>>row; cin>>line; intmaze[MAXSIZE][MAXSIZE];//迷宫定义 cout<<"正在生成迷宫迷宫,请稍候..."< while(p! =-1){ srand((unsigned)time(NULL));//生成迷宫,-1表示起点,1代表路障,0代表通行,随机产生0或1这两个随机数 for(i=1;i<=row;i++) for(j=1;j<=line;j++) maze[i][j]=rand()%2; for(i=0;i maze[0][i]=1; for(i=0;i maze[row+1][i]=1; for(i=0;i maze[i][0]=1; for(i=0;i maze[i][line+1]=1; maze[1][1]=0; maze[row][line]=0; if(Path(maze,move,row,line)! =0){ for(i=0;i for(j=0;j cout<<""< cout< } cout<<"总共有"< p=-1; } } break; case2: return0; default: cout<<"输入错误,请重新输入! "< break; } } return0; } 附录2 哈夫曼编码/译码程序代码: 头文件: #include #include #include usingnamespacestd; //哈夫曼树的定义 #defineMAXVALU2048 #defineMAXLEAF100 #defineMAXNODEMAXLEAF*2-1 typedefstruct{ intweight; intparent; intlchild; intrchild; }HNodeType; HNodeType*HuffmanTree(int,intv[]); //哈夫曼编码的定义 #defineMAXBIT2048 typedefstruct{ intbit[MAXBIT]; intstart; }HCodeType; voidHuffmanCode(charc[],intn,intv[]); voidOutput(charc[],charp[],intn,intnum); voidFOutput(charc[],charp[],intn,intnum); 函数文件: #include"hafuman.h" HNodeTypeHuffNode[MAXNODE]; HCodeTypeHuffCode[MAXLEAF]; HNodeType*HuffmanTree(intn,intv[]){ inti,j,m1,m2,x1,x2; for(i=0;i<2*n-1;i++){ HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; } for(i=0;i HuffNode[i].weight=v[i]; for(i=0;i m1=m2=MAXVALU; x1=x2=0; for(j=0;j if(HuffNode[j].parent==-1&&HuffNode[j].weight m2=m1; x2=x1; m1=HuffNode[j].weight; x1=j; } else if(HuffNode[j].parent==-1&&HuffNode[j].weight m2=HuffNode[j].weight; x2=j; } } HuffNode[x1].parent=n+i; HuffNode[x2].parent=n+i; HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2; } returnHuffNode; } voidHuffmanCode(charch[],intn,intv[]){ HCodeTypecd; HNodeType*h; h=newHNodeType; h=HuffmanTree(n,v); inti,j,c,p; chara; for(i=0;i cd.start=n-1; c=i; p=HuffNode[c].parent; while(p! =-1){ if(HuffNode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p; p=HuffNode[c].parent; } for(j=cd.start+1;j HuffCode[i].bit[j]=cd.bit[j]; HuffCode[i].start=cd.start; } cout<<"是否显示各字符编码及频率? (y/n)"< cin>>a; if(a! ='y'&&a! ='n'){ cout<<"输入错误,请重新输入! "< cin>>a; } if(a=='y'){ for(i=0;i cout< "; for(j=HuffCode[i].start+1;j cout< cout<<"频率: "< } } ofstreamoutfile1; outfile1.open("code2.txt",ios: : out); if(! outfile1){ cout<<"输出时打开code2文档出错! "< exit (1); } for(i=0;i outfile1< "; for(j=HuffCode[i].start+1;j outfile1< outfile1<<"频率: "< } outfile1.close(); } voidOutput(charc[],charp[],intn,intnum){ inti,j,k; for(i=0;i for(j=0;j if(p[i]==c[j]){ for(k=HuffCode[j].start+1;k cout< cout<<""; } cout< } voidFOutput(charc[],charp[],intn,intnum){ ofstreamoutfile1; outfile1.open("code1.txt",ios: : out); if(! outfile1){ cout<<"输出时打开code1文档出错! "< exit (1); } inti,j,k; for(i=0;i for(j=0;j if(p[i]==c[j]){ for(k=HuffCode[j].start+1;k outfile1< outfile1<<""; } outfile1< outfile1.close(); } 测试文件: #include"hafuman.h" intmain(){ charq[MAXNODE],p[MAXNODE],c[MAXLEAF],CorN; intn,num,i=0,j=0,v[MAXLEAF],choose;//num记录字符种数,n记录原文字符数 for(i=32;i<127;i++){ c[j]=i; j++; } num=j; for(i=0;i v[i]=0; cout<<"*************************************"< cout< cout<<"欢迎使用哈夫曼编译系统! "< cout< cout<<"*************************************"< while(CorN! ='n'){ cout<<"原文选择: "< cout<<"1.输入并存入文档2.从文档读取"< cin>>choose; if(choose! =1&&choose! =2){ cout<<"输入错误,请重新输入! "< cin>>choose; } if(choose==1){ ofstreamoutfile; outfile.open("code.txt",ios: : out); if(! outfile){ cout<<"输出时打开code文档出错! "< exit (1); } i=-1; cout<<"请输入所要编译的字符串,以#结束(规定“/”代表空格): "< while(q[i]! ='#'){ i++; cin>>q[i]; } i=-1; while(q[i]! ='#'){ i++; outfile< } outfile.close(); cout<<"字符串已存入文档! "< } cout<<"从文档中读取..."< ifstreaminfile; infile.open("code.txt",ios: : in); if(! infile){ cout<<"读取时打开code文档出错! "< exit (1); } for(i=0;i! =-1;i++){ infile.read(&p[i],sizeof(p[i])); if(p[i]=='#'){ n=i; i=-2; } } infile.close(); for(i=0;i for(j=0;j if(p[j]==c[i]) v[i]++; cout<<"原文为: "< for(i=0;i cout< cout< HuffmanCode(c,num,v); cout<<"译文为: "< Output(c,p,n,num); cout<<"将译文存入code1..."< FOutput(c,p,n,num); cout<<"存档成功! "< cout<<"继续或退出? (y/n)"< cin>>CorN; if(CorN! ='y'&&CorN! ='n'){ cout<<"输入错误,请重新输入! "< cin>>CorN; } } return0; } 附录3 排序算法的比较程序代码: 头文件: #defineMAXSIZE100 #include #include usingnamespacestd; typedefstruct{ intkey; }DataType; intcomnum; intmovnum; //函数声明 //直接插入排序 voidD_InsertSort(DataTypeR[],intn); //简单选择排序 voidSelectSort(DataTypeR[],intn); //冒泡排序 voidBubbleSort(DataTypeR[],intn); //希尔排序 voidShellInsert(DataTypeR[],intdk,intn); voidShellSort(DataTypeR[],intn,intd[],intt); //快速排序 intPartition(DataTypeR[],inti,intj); voidQuick_Sort(DataTypeR[],ints,intt); voidQuickSort(DataTypeR[],intn); //堆排序 voidHeapAdjust(DataTypeR[],ints,intt); voidHeapSort(DataTypeR[],intn); //归并排序 voidMerge(DataTypeR[],DataTypeR1[],ints,intm,intt); voidMergePass(DataTypeR[],DataTypeR1[],intlen,intn); voidMergeSort(DataTypeR[],intn); //函数定义 //直接插入排序 voidD_InsertSort(DataTypeR[],intn){ inti,j; comnum=movnum=0;//R[0]作为监视哨,comnum记录比较次数,movnum记录移动次数 for(i=2;i<=n;i++){ comnum++;//比较次数增加 if(R[i].key R[0]=R[i]; for(j=i-1;R[0].key R[j+1]=R[j]; movnum++;//移动次数增加 } R[j+1]=R[0]; } } } //简单选择排序 voidSelectSort(DataTypeR[],intn){ inti,j,k; comnum=movnum=0;//R[0]作为监视哨,comnum记录比较次数,movnum记录移动次数 for(i=1;i for(k=i,j=i+1;j<=n;j++){ comnum++;//比较次数增加 if(R[j].key k=j; } if(i! =k){ R[0]=R[k]; R[k]=R[i]; R[i]=R[0]; movnum++;//移动次数增加 } } } //冒泡排序 voidBubbleSort(DataTypeR[],intn){ inti,j,swap; comnum=movnum=0;//R[0]作为监视哨,comnum记录比较次数,movnum记录移动次数 for(i=1;i swap=0; for(j=1;j<=n-i;j++){ comnum++;//比较次数增加 if(R[j].key>R[j+1].key){ R[0]=R[j]; R[j]=R[j+1]; R[j+1]=R[0]; movnum++;//移动次数增
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 迷宫 问题 哈夫曼 编码 排序 代码