Java算法之经典题目篇.docx
- 文档编号:5194847
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:19
- 大小:24.49KB
Java算法之经典题目篇.docx
《Java算法之经典题目篇.docx》由会员分享,可在线阅读,更多相关《Java算法之经典题目篇.docx(19页珍藏版)》请在冰豆网上搜索。
Java算法之经典题目篇
Java算法之经典题目篇
现在先推出比较经典问题的Java算法,过段时间会继续推出,关于查询,数列,排序之类的java算法。
谢谢大家。
应版主要求我一楼放个目录,呵呵。
1:
费式数列2:
巴斯卡三角形3:
三色棋4:
老鼠走迷宫5:
骑士走棋盘6:
八个皇后
7:
八枚银币8:
生命游戏9:
字符串核对10:
双色,三色河内塔11:
背包问题12:
河内塔
1、Fibonacci-费式数列问题说明:
Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:
若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。
起初只有一只兔子,一个月后就有两只兔子,两个月后有三只兔子,三个月后有五只兔子(小兔子投入生产)……
2、巴斯卡三角形(Pascal)问题说明:
巴斯卡(Pascal)三角形基本上就是在解nCr,因为三角形上的每一个数字各对应一个nCr,其中n为row,而r为colnmu
3、三色旗(ThreeColorFlags)问题说明:
三色旗的问题最早由E.W.Dijkstra所提出,塔所使用的用语为DutchNationFlag(Dijkstra为荷兰人),而多数的作者则使用Three-ColorFlag来说明。
假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。
4、老鼠走迷宫(Mouse)问题说明:
老鼠走迷宫是循环求解的基本类型,我们在二维数组中用2来表示迷宫的墙壁,使用1来表示老鼠的行走路径,并用程序求出从入口到出口的距离。
5、骑士走棋盘(Knighttour)问题说明:
骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置。
6、八个皇后(Queen)问题说明:
西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上?
7、八枚银币(Coins)问题说明:
现在有八枚银币abcdefg,已知其中一枚是假币,其重量不同于真币,但不知道是轻还是重,如何用天平以最小的比较次数决定出那个是假币,并得知假币是比真币轻还是重。
8、生命游戏(Lifegame)问题说明:
生命游戏,为1970年英国数学家J.H.Conway所提出,某一细胞的邻居包括上,下,左,右,左上,左下,右上与右下相邻的细胞,游戏规则如下:
1,孤单死亡:
如果细胞的邻居小于一个,则该细胞在下一个状态死亡。
2,拥挤死亡:
如果细胞的邻居在四个以上,则该细胞在下一个状态死亡。
3,稳定:
如果细胞的邻居为两个或三个,则该细胞在下一个状态稳定。
4,复活:
如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一个细胞。
9、字符串核对(StringMatch)问题说明:
现在的一些高级程序语言对于字符串的处理支持越来越大,不过字符串搜寻本身仍是值得探讨的课题,在这里以BoyerMoore法来说明如何进行字符串说明,这个方法速度快且容易理解。
10、河内塔(Hanoi2Colors)问题说明:
河內之塔(TowersofHanoi)是法国人M.Claus(Lucas)於1883年从泰国带至法国的,河內为越战时北越的首都,即现在的胡志明市;1883年法国数学家EdouardLucas曾提及這个故事,据说创世紀时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),並命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将损毁,而也就是世界末日來临之时。
11、背包(KanpsackProblem)问题说明:
假设一个背包的负重最大可达8公斤,而希望在背包内放置负重范围你价值最高的物品。
费式数列(Fibonacci)
问题说明:
Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:
若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。
起初只有一只兔子,一个月后就有两只兔子,两个月后有三只兔子,三个月后有五只兔子(小兔子投入生产)……这就是Fibonacci数列,一般习惯称之为费式数列,例如:
1,1,2,3,5,8,13,21,34,55,89,……
算法代码(Java):
复制内容到剪贴板代码:
publicclassFibonacci{
publicstaticvoidmain(String[]args){
int[]fib=newint[20];fib[0]=0;fib[1]=1;
for(inti=2;i for(inti=0;i 奇妙的配酒巴斯卡三角形(Pascal) 问题说明: 巴斯卡(Pascal)三角形基本上就是在解nCr,因为三角形上的每一个数字各对应一个nCr,其中n为row,而r为colnmu, 算法代码(Java): importjava.awt.*;importjavax.swing.*; publicclassPascalextendsJFrame{publicPascal(){setBackground(Color.white); setTitle("巴斯卡三角形");setSize(520,350); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);show();} privatelongcombi(intn,intr){inti;longp=1; for(i=1;i<=r;i++)p=p*(n-i+1)/i; returnp;} publicvoidpaint(Graphicsg){finalintN=12;intn,r,t; for(n=0;n<=N;n++){ for(r=0;r<=n;r++)g.drawString(""+combi(n,r),(N-n)*20+r*40,n*20+50);} } publicstaticvoidmain(Stringargs[]){Pascalfrm=newPascal();}} 三色旗(ThreeColorFlags) 问题说明: 三色旗的问题最早由E.W.Dijkstra所提出,塔所使用的用语为DutchNationFlag(Dijkstra为荷兰人),而多数的作者则使用Three-ColorFlag来说明。 假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。 算法代码(Java): importjava.io.*; publicclassThreeColorsFlags{privatevoidswap(char[]flags,intx,inty){ chartemp;temp=flags[x];flags[x]=flags[y];flags[y]=temp;} publicStringmove(char[]flags){intwFlag=0;intbFlag=0;intrFlag=flags.length-1; while(wFlag<=rFlag){ if(flags[wFlag]=='W'){wFlag++;} elseif(flags[wFlag]=='B'){ swap(flags,bFlag,wFlag);bFlag++;wFlag++;} else{ while(wFlag swap(flags,rFlag,wFlag);rFlag--;} }returnnewString(flags);} publicstaticvoidmain(String[]args)throwsIOException{ BufferedReaderbuf;buf=newBufferedReader(newInputStreamReader(System.in)); System.out.print("输入三色旗顺序(ex.RWBBWRWR): ");Stringflags=buf.readLine(); ThreeColorsFlagsthreeColorsFlag=newThreeColorsFlags(); flags=threeColorsFlag.move(flags.toUpperCase().toCharArray()); System.out.println("移动顺序后: "+flags);}} 老鼠走迷宫(Mouse) 问题说明: 老鼠走迷宫是循环求解的基本类型,我们在二维数组中用2来表示迷宫的墙壁,使用1来表示老鼠的行走路径,并用程序求出从入口到出口的距离。 算法代码(Java): publicclassMouse{ privateintstartI,startJ;//入口privateintendI,endJ;//出口 privatebooleansuccess=false; publicstaticvoidmain(String[]args){ int[][]maze={{2,2,2,2,2,2,2},{2,0,0,0,0,0,2},{2,0,2,0,2,0,2}, {2,0,0,2,0,2,2},{2,2,0,2,0,2,2},{2,0,0,0,0,0,2},{2,2,2,2,2,2,2}}; System.out.println("显示迷宫: "); for(inti=0;i for(intj=0;j if(maze[j]==2)System.out.print("█"); elseSystem.out.print("");System.out.println();} Mousemouse=newMouse();mouse.setStart(1,1);mouse.setEnd(5,5); if(! mouse.go(maze)){System.out.println("\n没有找到出口! ");} else{System.out.println("\n找到出口! "); for(inti=0;i for(intj=0;j if(maze[j]==2)System.out.print("█"); elseif(maze[j]==1)System.out.print("◇"); elseSystem.out.print("");} System.out.println();}}} publicvoidsetStart(inti,intj){this.startI=i;this.startJ=j;} publicvoidsetEnd(inti,intj){this.endI=i;this.endJ=j;} publicbooleango(int[][]maze){returnvisit(maze,startI,startJ);} privatebooleanvisit(int[][]maze,inti,intj){maze[j]=1; if(i==endI&&j==endJ)success=true; if(! success&&maze[j+1]==0)visit(maze,i,j+1); if(! success&&maze[i+1][j]==0)visit(maze,i+1,j); if(! success&&maze[j-1]==0)visit(maze,i,j-1); if(! success&&maze[i-1][j]==0)visit(maze,i-1,j); if(! success)maze[j]=0;returnsuccess;}} 由于迷宫的设计,老鼠从迷宫的入口到出口的路径可能不只一条,下面我们显示所有路径。 publicclassMouse{privateintstartI,startJ;//入口privateintendI,endJ;//出口 publicstaticvoidmain(String[]args){ intmaze[][]={{2,2,2,2,2,2,2,2,2},{2,0,0,0,0,0,0,0,2}, {2,0,2,2,0,2,2,0,2},{2,0,2,0,0,2,0,0,2},{2,0,2,0,2,0,2,0,2},{2,0,0,0,0,0,2,0,2}, {2,2,0,2,2,0,2,2,2},{2,0,0,0,0,0,0,0,2},{2,2,2,2,2,2,2,2,2}}; System.out.println("显示迷宫: "); for(inti=0;i for(intj=0;j if(maze[i][j]==2)System.out.print("█"); elseSystem.out.print("");System.out.println();} Mousemouse=newMouse();mouse.setStart(1,1);mouse.setEnd(7,7);mouse.go(maze);} publicvoidsetStart(inti,intj){this.startI=i;this.startJ=j;} publicvoidsetEnd(inti,intj){this.endI=i;this.endJ=j;} publicvoidgo(int[][]maze){visit(maze,startI,startJ);} privatevoidvisit(int[][]maze,inti,intj){maze[i][j]=1; if(i==endI&&j==endJ){System.out.println("\n找到出口! "); for(intm=0;m for(intn=0;n if(maze[m][n]==2)System.out.print("█"); elseif(maze[m][n]==1)System.out.print("◇"); elseSystem.out.print("");System.out.println();}} if(maze[i][j+1]==0)visit(maze,i,j+1); if(maze[i+1][j]==0)visit(maze,i+1,j); if(maze[i][j-1]==0)visit(maze,i,j-1); if(maze[i-1][j]==0)visit(maze,i-1,j);maze[i][j]=0;}} 骑士走棋盘(Knighttour) 问题说明: 骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置。 算法代码(Java): publicclassKnight{ publicbooleantravel(intstartX,intstartY,int[][]board){ //对应骑士可以走的八个方向 int[]ktmove1={-2,-1,1,2,2,1,-1,-2};int[]ktmove2={1,2,2,1,-1,-2,-2,-1}; //下一个出路的位置int[]nexti=newint[board.length]; int[]nextj=newint[board.length]; //记录出路的个数int[]exists=newint[board.length];intx=startX; inty=startY; board[x][y]=1; for(intm=2;m<=Math.pow(board.length,2);m++){ for(intk=0;k exists[k]=0;} intcount=0; //试探八个方向 for(intk=0;k inttmpi=x+ktmove1[k]; inttmpj=y+ktmove2[k]; //如果是边界,不可以走 if(tmpi<0||tmpj<0|| tmpi>7||tmpj>7){continue;} //如果这个方向可以走,记录下来 if(board[tmpi][tmpj]==0){ nexti[count]=tmpi; nextj[count]=tmpj; //可走的方向加一个 count++;}} intmin=-1; if(count==0){ returnfalse;} elseif(count==1){ min=0;} else{ //找出下个位置的出路数 for(intl=0;l for(intk=0;k inttmpi=nexti[l]+ktmove1[k]; inttmpj=nextj[l]+ktmove2[k]; if(tmpi<0||tmpj<0|| tmpi>7||tmpj>7){ continue;} if(board[tmpi][tmpj]==0) exists[l]++;}} inttmp=exists[0]; min=0; //从可走的方向寻找最少出路的方向 for(intl=1;l if(exists[l] tmp=exists[l]; min=l; }}} //走最少出路的方向 x=nexti[min];y=nextj[min]; board[x][y]=m; } returntrue; } publicstaticvoidmain(String[]args){ int[][]board=newint[8][8]; Knightknight=newKnight(); if(knight.travel( Integer.parseInt(args[0]), Integer.parseInt(args[1]),board)){ System.out.println("走棋完成! ");} else{ System.out.println("走棋失败! ");} for(inti=0;i for(intj=0;j if(board[i][j]<10){ System.out.print(""+board[i][j]); } else{ System.out.print(board[i][j]);} System.out.print("");} System.out.println();}}} 八个皇后(Queen) 问题说明: 西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上? 算法代码(Java): publicclassQueen{ //同位置是否有皇后,1表示有 privateint[]column; //右上至左下是否有皇后 privateint[]rup; //左上至右下是否有皇后 privateint[]lup; //解答 privateint[]queen; //解答编号 privateintnum; publicQueen(){ column=newint[8+1]; rup=newint[2*8+1]; lup=newint[2*8+1]; for(inti=1;i<=8;i++) column[i]=1; for(inti=1;i<=2*8;i++) rup[i]=lup[i]=1; queen=newint[8+1];} publicvoidback
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 算法 经典 题目
![提示](https://static.bdocx.com/images/bang_tan.gif)