java经典算法系列.docx
- 文档编号:4355403
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:35
- 大小:28.01KB
java经典算法系列.docx
《java经典算法系列.docx》由会员分享,可在线阅读,更多相关《java经典算法系列.docx(35页珍藏版)》请在冰豆网上搜索。
java经典算法系列
Java算法之经典题目篇(转自瓢虫论坛橡树心)
现在先推出比较经典问题的Java算法,过段时间会继续推出,关于查询,数列,
排序之类的java算法。
谢谢大家。
应版主要求我一楼放个目录,呵呵。
1:
费式数列
2:
巴斯卡三角形
3:
三色棋
4:
老鼠走迷宫
5:
骑士走棋盘
6:
八个皇后
7:
八枚银币
8:
生命游戏
9:
字符串核对
10:
双色,三色河内塔
11:
背包问题
12:
河内塔
费式数列(Fibonacci)
问题说明:
Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:
若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。
起初只有一只兔子,一个月后就有两只兔子,两个月后有三只兔子,三个月后有五只兔子(小兔子投入生产)……
这就是Fibonacci数列,一般习惯称之为费式数列,例如:
1,1,2,3,5,8,13,21,34,55,89,……
算法代码(Java):
1.publicclassFibonacci{
2. publicstaticvoidmain(String[]args){
3. int[]fib=newint[20];
4.
5. fib[0]=0;
6. fib[1]=1;
7.
8. for(inti=2;i 9. fib[i]=fib[i-1]+fib[i-2]; 10. 11. for(inti=0;i 12. System.out.print(fib[i]+""); 13. System.out.println(); 14. } 15.} 巴斯卡三角形(Pascal) 问题说明: 巴斯卡(Pascal)三角形基本上就是在解nCr ,因为三角形上的每一个数字各对应一个nCr ,其中n为row,而r为colnmu, 算法代码(Java): 1. 2.importjava.awt.*; 3.importjavax.swing.*; 4. 5.publicclassPascalextendsJFrame{ 6. publicPascal(){ 7. setBackground(Color.white); 8. setTitle("巴斯卡三角形"); 9. setSize(520,350); 10. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 11. show(); 12. } 13. 14. privatelongcombi(intn,intr){ 15. inti; 16. longp=1; 17. 18. for(i=1;i<=r;i++) 19. p=p*(n-i+1)/i; 20. 21. returnp; 22. } 23. 24. publicvoidpaint(Graphicsg){ 25. finalintN=12; 26. intn,r,t; 27. 28. for(n=0;n<=N;n++){ 29. for(r=0;r<=n;r++) 30. g.drawString(""+combi(n,r), 31. (N-n)*20+r*40,n*20+50); 32. } 33. } 34. 35. publicstaticvoidmain(Stringargs[]){ 36. Pascalfrm=newPascal(); 37. } 38.} 三色旗(ThreeColorFlags) 问题说明: 三色旗的问题最早由E.W.Dijkstra所提出,塔所使用的用语为DutchNationFlag(Dijkstra为荷兰人),而多数的作者则使用Three-ColorFlag来说明。 假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只能调换两个旗子。 算法代码(Java): 1.importjava.io.*; 2. 3.publicclassThreeColorsFlags{ 4. privatevoidswap(char[]flags,intx,inty){ 5. chartemp; 6. temp=flags[x]; 7. flags[x]=flags[y]; 8. flags[y]=temp; 9. } 10. 11. publicStringmove(char[]flags){ 12. intwFlag=0; 13. intbFlag=0; 14. intrFlag=flags.length-1; 15. 16. while(wFlag<=rFlag){ 17. if(flags[wFlag]=='W'){ 18. wFlag++; 19. } 20. elseif(flags[wFlag]=='B'){ 21. swap(flags,bFlag,wFlag); 22. bFlag++; 23. wFlag++; 24. } 25. else{ 26. while(wFlag 27. rFlag--; 28. swap(flags,rFlag,wFlag); 29. rFlag--; 30. } 31. } 32. 33. returnnewString(flags); 34. } 35. 36. publicstaticvoidmain(String[]args) 37. throwsIOException{ 38. BufferedReaderbuf; 39. buf=newBufferedReader( 40. newInputStreamReader(System.in)); 41. 42. System.out.print("输入三色旗顺序(ex.RWBBWRWR): "); 43. Stringflags=buf.readLine(); 44. 45. ThreeColorsFlagsthreeColorsFlag=newThreeColorsFlags(); 46. flags=threeColorsFlag.move( 47. flags.toUpperCase().toCharArray()); 48. 49. System.out.println("移动顺序后: "+flags); 50. } 51.} 老鼠走迷宫(Mouse) 问题说明: 老鼠走迷宫是循环求解的基本类型,我们在二维数组中用2来表示迷宫的墙壁,使用1来表示老鼠的行走路径,并用程序求出从入口到出口的距离。 算法代码(Java): 1.publicclassMouse{ 2. privateintstartI,startJ; //入口 3. privateintendI,endJ; //出口 4. privatebooleansuccess=false; 5. 6. publicstaticvoidmain(String[]args){ 7. int[][]maze={{2,2,2,2,2,2,2}, 8. {2,0,0,0,0,0,2}, 9. {2,0,2,0,2,0,2}, 10. {2,0,0,2,0,2,2}, 11. {2,2,0,2,0,2,2}, 12. {2,0,0,0,0,0,2}, 13. {2,2,2,2,2,2,2}}; 14. 15. System.out.println("显示迷宫: "); 16. for(inti=0;i 17. for(intj=0;j 18. if(maze[j]==2) 19. System.out.print("█"); 20. else 21. System.out.print(" "); 22. System.out.println(); 23. } 24. 25. Mousemouse=newMouse(); 26. mouse.setStart(1,1); 27. mouse.setEnd(5,5); 28. 29. if(! mouse.go(maze)){ 30. System.out.println("\n没有找到出口! "); 31. } 32. else{ 33. System.out.println("\n找到出口! "); 34. for(inti=0;i 35. for(intj=0;j 36. if(maze[j]==2) 37. System.out.print("█"); 38. elseif(maze[j]==1) 39. System.out.print("◇"); 40. else 41. System.out.print(" "); 42. } 43. System.out.println(); 44. } 45. } 46. } 47. 48. publicvoidsetStart(inti,intj){ 49. this.startI=i; 50. this.startJ=j; 51. } 52. 53. publicvoidsetEnd(inti,intj){ 54. this.endI=i; 55. this.endJ=j; 56. } 57. 58. publicbooleango(int[][]maze){ 59. returnvisit(maze,startI,startJ); 60. } 61. 62. privatebooleanvisit(int[][]maze,inti,intj){ 63. maze[j]=1; 64. 65. if(i==endI&&j==endJ) 66. success=true; 67. 68. if(! success&&maze[j+1]==0) 69. visit(maze,i,j+1); 70. if(! success&&maze[i+1][j]==0) 71. visit(maze,i+1,j); 72. if(! success&&maze[j-1]==0) 73. visit(maze,i,j-1); 74. if(! success&&maze[i-1][j]==0) 75. visit(maze,i-1,j); 76. 77. if(! success) 78. maze[j]=0; 79. 80. returnsuccess; 81. } 82.} 复制代码 由于迷宫的设计,老鼠从迷宫的入口到出口的路径可能不只一条,下面我们显示所有路径。 1.publicclassMouse{ 2. privateintstartI,startJ; //入口 3. privateintendI,endJ; //出口 4. 5. publicstaticvoidmain(String[]args){ 6. intmaze[][]={{2,2,2,2,2,2,2,2,2}, 7. {2,0,0,0,0,0,0,0,2}, 8. {2,0,2,2,0,2,2,0,2}, 9. {2,0,2,0,0,2,0,0,2}, 10. {2,0,2,0,2,0,2,0,2}, 11. {2,0,0,0,0,0,2,0,2}, 12. {2,2,0,2,2,0,2,2,2}, 13. {2,0,0,0,0,0,0,0,2}, 14. {2,2,2,2,2,2,2,2,2}}; 15. 16. System.out.println("显示迷宫: "); 17. for(inti=0;i 18. for(intj=0;j 19. if(maze[i][j]==2) 20. System.out.print("█"); 21. else 22. System.out.print(" "); 23. System.out.println(); 24. } 25. 26. Mousemouse=newMouse(); 27. mouse.setStart(1,1); 28. mouse.setEnd(7,7); 29. 30. mouse.go(maze); 31. } 32. 33. publicvoidsetStart(inti,intj){ 34. this.startI=i; 35. this.startJ=j; 36. } 37. 38. publicvoidsetEnd(inti,intj){ 39. this.endI=i; 40. this.endJ=j; 41. } 42. 43. publicvoidgo(int[][]maze){ 44. visit(maze,startI,startJ); 45. } 46. 47. privatevoidvisit(int[][]maze,inti,intj){ 48. maze[i][j]=1; 49. 50. if(i==endI&&j==endJ){ 51. System.out.println("\n找到出口! "); 52. for(intm=0;m 53. for(intn=0;n 54. if(maze[m][n]==2) 55. System.out.print("█"); 56. elseif(maze[m][n]==1) 57. System.out.print("◇"); 58. else 59. System.out.print(" "); 60. } 61. System.out.println(); 62. } 63. } 64. 65. if(maze[i][j+1]==0) 66. visit(maze,i,j+1); 67. if(maze[i+1][j]==0) 68. visit(maze,i+1,j); 69. if(maze[i][j-1]==0) 70. visit(maze,i,j-1); 71. if(maze[i-1][j]==0) 72. visit(maze,i-1,j); 73. 74. maze[i][j]=0; 75. } 76.} 骑士走棋盘(Knighttour) 问题说明: 骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置。 算法代码(Java): 1.publicclassKnight{ 2. publicbooleantravel(intstartX, 3. intstartY,int[][]board){ 4. //对应骑士可以走的八个方向 5. int[]ktmove1={-2,-1,1,2,2,1,-1,-2}; 6. int[]ktmove2={1,2,2,1,-1,-2,-2,-1}; 7. 8. //下一个出路的位置 int[]nexti=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 经典 算法 系列
![提示](https://static.bdocx.com/images/bang_tan.gif)