java经典算法系列.docx
《java经典算法系列.docx》由会员分享,可在线阅读,更多相关《java经典算法系列.docx(35页珍藏版)》请在冰豆网上搜索。
![java经典算法系列.docx](https://file1.bdocx.com/fileroot1/2022-11/30/7d4b28f0-c2c2-4afe-8b29-5f5e265c1005/7d4b28f0-c2c2-4afe-8b29-5f5e265c10051.gif)
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;i9. fib[i]=fib[i-1]+fib[i-2];
10.
11. for(inti=0;i12. 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(wFlag27. 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;i17. for(intj=0;j18. 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;i35. for(intj=0;j36. 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;i18. for(intj=0;j19. 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;m53. for(intn=0;n54. 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=