组合数学实验.docx
- 文档编号:28779602
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:22
- 大小:70.57KB
组合数学实验.docx
《组合数学实验.docx》由会员分享,可在线阅读,更多相关《组合数学实验.docx(22页珍藏版)》请在冰豆网上搜索。
组合数学实验
组合数学实验
实验一Cayley树的生成
实验二序数法生成全排列
源代码:
importjava.io.*;
importjava.util.ArrayList;
classXushufa{
publicstaticvoidmain(Stringargs[]){
XushufaXushufa=null;
intnum=0;//要排序的个数
booleanflag=true;//标志位,如果用户输入的待排序个数不合法,该值一直为true
ArrayList
while(flag){
try{
num=Integer.parseInt(readDataFromConsole("请输入待排序的个数:
"));
flag=false;
}catch(Exceptione){
System.out.println("请输入整数.");
}
}
for(inti=1;i<=num;i++){
strs.add(readDataFromConsole("请输入第"+i+"个字符:
"));
}
Xushufa=newXushufa(strs.toArray(newString[]{}));
System.out.println("排列后的数据为:
");
Xushufa.sort();
}
privateString[]str=null;
publicXushufa(String[]s){
this.str=s;
}
//从控制台读入数据
privatestaticStringreadDataFromConsole(Stringprompt){
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
Stringstr=null;
try{
System.out.print(prompt);
str=br.readLine();
}catch(IOExceptione){
e.printStackTrace();
}
returnstr;
}
privatevoidsort(){
intnum=str.length;
int[]n1=newint[num-1];
int[]nss=newint[num];
String[]s=newString[num];
booleanflag=false;
intx=0;
do{
if(x==0){//第一遍初始化
for(inti=0;i n1[i]=0; } }else{//生成序数 for(inti=0;i if(n1[num-2-i] n1[num-2-i]++; for(intj=num-1-i;j n1[j]=0; } break; } } } for(inti=0;i if(n1[i]==(num-1-i)){ flag=false; }else{ flag=true; break; } } for(inti=0;i nss[i]=0; } for(inti=0;i inthh=0,j=0;//记录前边总共移动的位数 do{ if(nss[num-1-hh]==1){ hh++; continue; }else{ if(j==n1[i]){ break;//每个字母距最右端未填入的位置 }else{ hh++; j++; } } }while(true); hh=num-1-hh; s[hh]=str[num-1-i]; nss[hh]=1; } for(inti=0;i if(nss[i]==0){ s[i]=str[0]; break; } } System.out.print(++x+"\t"); for(inti=0;i System.out.print(n1[i]+""); } System.out.print("\t"); for(inti=0;i System.out.print(s[i]+""); } System.out.println(); }while(flag); } } 运行结果: 实验三字典序法生成全排列 源代码: importjava.util.Scanner; publicclassZidianxufa{ /** *@paramargs */ publicstaticvoidmain(String[]args){ //TODO自动生成方法存根 Zidianxufaa=newZidianxufa(); Scannerinput=newScanner(System.in); System.out.print("请输入要排列的元素有多少种: "); intcount=input.nextInt(); int[]p=newint[count]; for(inti=1;i<=p.length;i++){ p[i-1]=i; } booleancon; do{ a.pr(p);//输出排列p con=a.next(p);//求出按字典序排列的下一个排列p }while(con); } publicintindexof(int[]n){ intindex=-1; for(inti=n.length-1;i>=1;i--){ if(n[i-1] index=i-1; break; } } returnindex; } publicintindexmin(intini,int[]n){ intindex=n.length-1; intmin=n[ini+1]; for(inti=ini+1;i if(n[i]<=min&&n[i]>n[ini]){ min=n[i]; index=i; } } returnindex; } publicvoidswap(intindex1,intindex2,int[]n){ inttemp; temp=n[index1]; n[index1]=n[index2]; n[index2]=temp; } publicvoidoppositeDirection(intindex1,int[]n){ for(inti=index1+1,j=n.length-1,k=0,temp;k<=(n.length-i)/2;i++,j--,k++){ temp=n[i]; n[i]=n[j]; n[j]=temp; } } publicbooleannext(int[]n){ intindex1=indexof(n); if(index1==-1){ returnfalse; } intindex2=indexmin(index1,n); swap(index1,index2,n); oppositeDirection(index1,n); returntrue; } publicvoidpr(int[]n){ for(inti=0;i System.out.print(n[i]+""); } System.out.println(); } } 运行结果: 实验四字典序法生成组合 源代码: importjava.io.BufferedWriter; importjava.io.FileWriter; importjava.util.Scanner; publicclassZidian_zuhe{ privateintcount,n,r; int[][]a; Zidian_zuhe(intn,intr) { this.n=n; this.r=r; this.count=func(n)/func(n-r)/func(r); //生成算法 a=newint[count+1][r+1]; for(inti=1;i<=r;i++) { a[1][i]=i; } for(intk=2;k<=count;k++)//每一种组合 { ints; for(s=1;s<=r;s++) { a[k][s]=a[k-1][s];//每组从上一个变化而来 } intmax=0; inti=0; for(s=1;s<=r;s++)//s1 { if((a[k][s] { max=s; i=max; } } a[k][i]++;//s2 for(intj=i+1;j<=r;j++)//s3 { a[k][j]=a[k][j-1]+1; } }//for(...)end //输出 for(ints1=1;s1<=count;s1++)//共n的阶乘个,对于每一个+++++ { System.out.print("第"+s1+"个: "); System.out.print(""); for(inti1=1;i1<=r;i1++) { System.out.print(a[s1][i1]); } System.out.println(); } } intfunc(intm1)//求阶乘 { intresult=1; while(m1>=1) { result*=m1; m1--; } returnresult; } voidoutput()throwsException{//输出 FileWriterfw=newFileWriter("E: //java_result//zidian_zh.txt"); BufferedWriterbw=newBufferedWriter(fw); bw.newLine(); inti,y; for(y=1;y<=count;y++) { bw.write("第"+y+"个: "); for(i=1;i<=r;i++) { bw.write(this.a[y][i]+""); } } bw.close(); } publicstaticvoidmain(Stringargs[]) { intd; System.out.println("字典序法生成组合,请输入可选集合元素的个数(正整数): "); Scannerin=newScanner(System.in); d=in.nextInt(); d=(int)d;//输入 System.out.println("请输入选取的元素的个数(正整数): "); intd2; d2=in.nextInt(); d2=(int)d2; Zidian_zuhezidian=newZidian_zuhe(d,d2); try{ zidian.output(); } catch(Exceptione){ System.out.println("文件写入异常。 "+e.toString()); } finally { } } } 运行结果: 实验五广义容斥原理路径数问题 源代码: importjava.util.ArrayList; importjava.io.*; //广义容斥原理,输入路径的起始位置,并输入排除的路径,输出从起点到终点的路径个数并输出至少5条路径。 classLujingfa{ //从控制台读入数据 privatestaticintreadDataFromConsole(Stringprompt){ BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in)); Stringstr=null; try{ System.out.print(prompt); str=br.readLine(); }catch(IOExceptione){ e.printStackTrace(); } booleanflag=true; intretValue=0; while(flag){ try{ retValue=Integer.parseInt(str); flag=false; }catch(Exceptione){ System.out.println("请输入整数."); } } returnretValue; } staticdoublezuhe(doublen,doublem) { doubles=1; doublex=n-m; for(;n>0;n--){ s=s*n; } for(;m>0;m--){ s=s/m; } for(;x>0;x--){ s=s/x; } returns; } publicstaticvoidmain(Stringargs[]){ classNode{ doublex=0; doubley=0; } classNodeNode{ Nodestart=newNode(); Nodeend=newNode(); } Nodestart=newNode(); Nodeend=newNode(); ArrayList NodeNodenodeNode=null; for(inti=0;i<100;i++){ nodeNode=newNodeNode(); nodeNodes.add(nodeNode); nodeNode=null; } doublen=0,cent=0; doubles=0; start.x=readDataFromConsole("请输入起点的X坐标: "); start.y=readDataFromConsole("请输入起点的Y坐标: "); end.x=readDataFromConsole("请输入终点的X坐标: "); end.y=readDataFromConsole("请输入终点的Y坐标: "); n=readDataFromConsole("请输入排除的边的条数: "); for(inti=1;i<=n;i++){//排除的边依次为起点,终点 nodeNodes.get(i).start.x=readDataFromConsole("请输入第"+i+"条排除边起点的X坐标: "); nodeNodes.get(i).start.y=readDataFromConsole("请输入第"+i+"条排除边起点的Y坐标: "); nodeNodes.get(i).end.x=readDataFromConsole("请输入第"+i+"条排除边终点的X坐标: "); nodeNodes.get(i).end.y=readDataFromConsole("请输入第"+i+"条排除边终点的Y坐标: "); } s=zuhe((end.x-start.x+end.y-start.y),(end.x-start.x)); System.out.println("未排除不能走的路径的总路径数: "+s); doublex=0,y=0; for(inti=0;i { x=nodeNodes.get(i).start.x-start.x; y=nodeNodes.get(i).start.y-start.y; cent=zuhe(x+y,x); x=end.x-nodeNodes.get(i).end.x; y=end.y-nodeNodes.get(i).end.y; cent=cent*zuhe(x+y,x); doubleii=i+1; System.out.println("不能走的A"+ii+"路径数为: "+cent); s=s-cent; } for(inti=0;i for(intj=i+1;j x=nodeNodes.get(i).start.x-start.x; y=nodeNodes.get(i).start.y-start.y; cent=zuhe(x+y,x); x=nodeNodes.get(j).start.x-nodeNodes.get(i).end.x; x=nodeNodes.get(j).start.y-nodeNodes.get(i).end.y; if(x==0||y==0){cent=cent;} elseif(x<0||y<0){cent=0;} else{cent=cent*zuhe(x+y,x);} x=end.x-nodeNodes.get(j).end.x; y=end.y-nodeNodes.get(j).end.y; cent=cent*zuhe(x+y,x); doubleii=i+1; doublejj=j+1; System.out.println("不能走的A"+ii+"A"+jj+"路径数为: "+cent); s=s+cent; } } for(inti=0;i { for(intj=i+1;j { for(intk=j+1;k { x=nodeNodes.get(i).start.x-start.x; y=nodeNodes.get(i).start.y-start.y; cent=zuhe(x+y,x); x=nodeNodes.get(j).start.x-nodeNodes.get(i).end.x; x=nodeNodes.get(j).start.y-nodeNodes.get(i).end.y; if(x==0||y==0){cent=cent;} elseif(x<0||y<0){cent=0;} else{cent=cent*zuhe(x+y,x);} x=nodeNodes.get(k).start.x-nodeNodes.get(j).end.x; x=nodeNodes.get(k).start.y-nodeNodes.get(j).end.y; if(x==0||y==0){cent=cent;} elseif(x<0||y<0){cent=0;} else{cent=cent*zuhe(x+y,x);} x=end.x-nodeNodes.get(k).end.x; y=end.y-nodeNodes.get(k).end.y; cent=cent*zuhe(x+y,x); doubleii=i+1; doublejj=j+1; doublekk=k+1; System.out.println("不能走的A"+ii+"A"+jj+"A"+kk+"路径数为: "+cent); s=s-cent; } } } x=nodeNodes.get(0).start.x-start.x; y=nodeNodes.get(0).start.y-start.y; cent=zuhe(x+y,x); x=nodeNodes.get (1).s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 组合 数学 实验