ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:24.49KB ,
资源ID:5194847      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5194847.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java算法之经典题目篇.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java算法之经典题目篇.docx

1、Java算法之经典题目篇Java算法之经典题目篇 现在先推出比较经典问题的Java算法,过段时间会继续推出,关于查询,数列,排序之类的java算法。谢谢大家。应版主要求我一楼放个目录,呵呵。1:费式数列2:巴斯卡三角形3: 三色棋4:老鼠走迷宫5:骑士走棋盘6:八个皇后7:八枚银币8:生命游戏9:字符串核对10:双色,三色河内塔11:背包问题12:河内塔1、Fibonacci-费式数列问题说明: Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。起初只有一只兔子,一个月后就有两只兔子,两个月后有三只兔子,三个月后有五只

2、兔子(小兔子投入生产)2、巴斯卡三角形(Pascal) 问题说明: 巴斯卡(Pascal)三角形基本上就是在解nCr ,因为三角形上的每一个数字各对应一个nCr ,其中n为row,而r为colnmu3、三色旗(ThreeColorFlags) 问题说明: 三色旗的问题最早由E.W.Dijkstra所提出,塔所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来说明。假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在

3、绳子上进行这个动作,而且一次只能调换两个旗子。4、老鼠走迷宫(Mouse) 问题说明: 老鼠走迷宫是循环求解的基本类型,我们在二维数组中用2来表示迷宫的墙壁,使用1来表示老鼠的行走路径,并用程序求出从入口到出口的距离。5、骑士走棋盘(Knight tour) 问题说明: 骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置。6、八个皇后(Queen) 问题说明: 西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上?7、八枚银币(Coins) 问题说明: 现在有八枚银币

4、abcdefg,已知其中一枚是假币,其重量不同于真币,但不知道是轻还是重,如何用天平以最小的比较次数决定出那个是假币,并得知假币是比真币轻还是重。8、生命游戏(Life game) 问题说明:生命游戏,为1970年英国数学家J.H.Conway所提出,某一细胞的邻居包括上,下,左,右,左上,左下,右上与右下相邻的细胞,游戏规则如下: 1,孤单死亡:如果细胞的邻居小于一个,则该细胞在下一个状态死亡。 2,拥挤死亡:如果细胞的邻居在四个以上,则该细胞在下一个状态死亡。 3,稳定:如果细胞的邻居为两个或三个,则该细胞在下一个状态稳定。 4,复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置

5、将复活一个细胞。9、字符串核对(String Match) 问题说明: 现在的一些高级程序语言对于字符串的处理支持越来越大,不过字符串搜寻本身仍是值得探讨的课题,在这里以Boyer Moore法来说明如何进行字符串说明,这个方法速度快且容易理解。10、河内塔(Hanoi2Colors) 问题说明: 河內之塔(Towers of Hanoi)是法国人M.Claus(Lucas)於1883年从泰国带至法国的,河內为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及這个故事,据说创世紀时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第

6、一根棒上放置64个由上至下依由小至大排列的金盘(Disc),並命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将损毁,而也就是世界末日來临之时。11、背包(Kanpsack Problem) 问题说明: 假设一个背包的负重最大可达8公斤,而希望在背包内放置负重范围你价值最高的物品。费式数列(Fibonacci)问题说明: Fibonacci为1200年代的欧洲数学家,在他的著作中曾经提到:若有一只兔子每个月生一只小兔子,一个月后小兔子也开始生产。起初只有一只兔子,一个月后就有两只兔子,两个月后有三只兔子

7、,三个月后有五只兔子(小兔子投入生产) 这就是Fibonacci数列,一般习惯称之为费式数列,例如:1,1,2,3,5,8,13,21,34,55,89,算法代码(Java):复制内容到剪贴板代码:public class Fibonacci public static void main(String args) int fib = new int20; fib0 = 0; fib1 = 1; for(int i = 2; i fib.length; i+) fibi = fibi-1 + fibi-2; for(int i = 0; i fib.length; i+) System.out

8、.print(fibi + ); System.out.println(); 奇妙的配酒巴斯卡三角形(Pascal)问题说明: 巴斯卡(Pascal)三角形基本上就是在解nCr ,因为三角形上的每一个数字各对应一个nCr ,其中n为row,而r为colnmu,算法代码(Java):import java.awt.*; import javax.swing.*; public class Pascal extends JFrame public Pascal() setBackground(Color.white); setTitle(巴斯卡三角形); setSize(520, 350); se

9、tDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); show(); private long combi(int n, int r) int i; long p = 1; for(i = 1; i = r; i+) p = p * (n-i+1) / i; return p; public void paint(Graphics g) final int N = 12; int n, r, t; for(n = 0; n = N; n+) for(r = 0; r = n; r+) g.drawString( + combi(n, r), (N-n)*2

10、0 + r * 40, n * 20 + 50); public static void main(String args) Pascal frm = new Pascal(); 三色旗(ThreeColorFlags)问题说明: 三色旗的问题最早由E.W.Dijkstra所提出,塔所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来说明。假设有一条绳子,上面有红,白,蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列蓝,白,红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且

11、一次只能调换两个旗子。算法代码(Java):import java.io.*;public class ThreeColorsFlags private void swap(char flags, int x, int y) char temp; temp = flagsx; flagsx = flagsy; flagsy = temp; public String move(char flags) int wFlag = 0; int bFlag = 0; int rFlag = flags.length - 1; while(wFlag = rFlag) if(flagswFlag = W

12、) wFlag+; else if(flagswFlag = B) swap(flags, bFlag, wFlag); bFlag+; wFlag+; else while(wFlag rFlag & flagsrFlag = R) rFlag-; swap(flags, rFlag, wFlag); rFlag-; return new String(flags); public static void main(String args) throws IOException BufferedReader buf; buf = new BufferedReader( new InputSt

13、reamReader(System.in); System.out.print(输入三色旗顺序(ex. RWBBWRWR):); String flags = buf.readLine(); ThreeColorsFlags threeColorsFlag = new ThreeColorsFlags(); flags = threeColorsFlag.move( flags.toUpperCase().toCharArray(); System.out.println(移动顺序后: + flags); 老鼠走迷宫(Mouse)问题说明: 老鼠走迷宫是循环求解的基本类型,我们在二维数组中用2

14、来表示迷宫的墙壁,使用1来表示老鼠的行走路径,并用程序求出从入口到出口的距离。算法代码(Java):public class Mouse private int startI, startJ; / 入口 private int endI, endJ; / 出口 private boolean success = false; public static void main(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

15、, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2; System.out.println(显示迷宫:); for(int i = 0; i maze.length; i+) for(int j = 0; j maze0.length; j+) if(mazej = 2) System.out.print(); else System.out.print( ); System.out.println(); Mouse mouse = new Mouse(); mouse.setStart(1, 1); mouse.setEnd(5

16、, 5); if(!mouse.go(maze) System.out.println(n没有找到出口!); else System.out.println(n找到出口!); for(int i = 0; i maze.length; i+) for(int j = 0; j maze0.length; j+) if(mazej = 2) System.out.print(); else if(mazej = 1) System.out.print(); else System.out.print( ); System.out.println(); public void setStart(i

17、nt i, int j) this.startI = i; this.startJ = j; public void setEnd(int i, int j) this.endI = i; this.endJ = j; public boolean go(int maze) return visit(maze, startI, startJ); private boolean visit(int maze, int i, int j) mazej = 1; if(i = endI & j = endJ) success = true; if(!success & mazej+1 = 0) vi

18、sit(maze, i, j+1); if(!success & mazei+1j = 0) visit(maze, i+1, j); if(!success & mazej-1 = 0) visit(maze, i, j-1); if(!success & mazei-1j = 0)visit(maze, i-1, j); if(!success) mazej = 0; return success; 由于迷宫的设计,老鼠从迷宫的入口到出口的路径可能不只一条,下面我们显示所有路径。public class Mouse private int startI, startJ; / 入口 priv

19、ate int endI, endJ; / 出口 public static void main(String args) int maze = 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,

20、 2, 2, 2; System.out.println(显示迷宫:); for(int i = 0; i maze.length; i+) for(int j = 0; j maze0.length; j+) if(mazeij = 2) System.out.print(); else System.out.print( ); System.out.println(); Mouse mouse = new Mouse(); mouse.setStart(1, 1); mouse.setEnd(7, 7); mouse.go(maze); public void setStart(int i

21、, int j) this.startI = i; this.startJ = j; public void setEnd(int i, int j) this.endI = i; this.endJ = j; public void go(int maze) visit(maze, startI, startJ); private void visit(int maze, int i, int j) mazeij = 1; if(i = endI & j = endJ) System.out.println(n找到出口!); for(int m = 0; m maze.length; m+)

22、 for(int n = 0; n maze0.length; n+) if(mazemn = 2) System.out.print(); else if(mazemn = 1) System.out.print(); else System.out.print( ); System.out.println(); if(mazeij+1 = 0) visit(maze, i, j+1); if(mazei+1j = 0) visit(maze, i+1, j); if(mazeij-1 = 0) visit(maze, i, j-1); if(mazei-1j = 0) visit(maze

23、, i-1, j); mazeij = 0; 骑士走棋盘(Knight tour)问题说明:骑士游戏,在十八世纪倍受数学家与拼图迷的注意,骑士的走法为西洋棋的走发,骑士可以由任何一个位置出发,它要如何走完所有的位置。算法代码(Java):public class Knight public boolean travel(int startX, int startY, int board) / 对应骑士可以走的八个方向 int ktmove1 = -2, -1, 1, 2, 2, 1, -1, -2; int ktmove2 = 1, 2, 2, 1, -1, -2, -2, -1; / 下一个

24、出路的位置 int nexti = new intboard.length; int nextj = new intboard.length; / 记录出路的个数 int exists = new intboard.length; int x = startX; int y = startY; boardxy = 1; for(int m = 2; m = Math.pow(board.length, 2); m+) for(int k = 0; k board.length; k+) existsk = 0; int count = 0; / 试探八个方向 for(int k = 0; k

25、board.length; k+) int tmpi = x + ktmove1k; int tmpj = y + ktmove2k; / 如果是边界,不可以走 if(tmpi 0 | tmpj 7 | tmpj 7) continue; / 如果这个方向可以走,记录下来 if(boardtmpitmpj = 0) nexticount = tmpi; nextjcount = tmpj; / 可走的方向加一个 count+; int min = -1; if(count = 0) return false; else if(count = 1) min = 0; else / 找出下个位置的

26、出路数 for(int l = 0; l count; l+) for(int k = 0; k board.length; k+) int tmpi = nextil + ktmove1k; int tmpj = nextjl + ktmove2k; if(tmpi 0 | tmpj 7 | tmpj 7) continue; if(boardtmpitmpj = 0) existsl+; int tmp = exists0; min = 0; / 从可走的方向寻找最少出路的方向 for(int l = 1; l count; l+) if(existsl tmp) tmp = exists

27、l; min = l; / 走最少出路的方向 x = nextimin; y = nextjmin; boardxy = m; return true; public static void main(String args) int board = new int88; Knight knight = new Knight(); if(knight.travel( Integer.parseInt(args0), Integer.parseInt(args1), board) System.out.println(走棋完成!); else System.out.println(走棋失败!);

28、 for(int i = 0; i board.length; i+) for(int j = 0; j board0.length; j+) if(boardij 10) System.out.print( + boardij); else System.out.print(boardij); System.out.print( ); System.out.println(); 八个皇后(Queen)问题说明: 西洋棋中的皇后可以直线前进,吃掉遇到的所有棋子,如果棋盘上有八个皇后,则这八个皇后如何相安无事的放置在棋盘上?算法代码(Java):public class Queen / 同位置是

29、否有皇后,1表示有 private int column; / 右上至左下是否有皇后 private int rup; / 左上至右下是否有皇后 private int lup; / 解答 private int queen; / 解答编号 private int num; public Queen() column = new int8+1; rup = new int2*8+1; lup = new int2*8+1; for(int i = 1; i = 8; i+) columni = 1; for(int i = 1; i = 2*8; i+) rupi = lupi = 1; queen = new int8+1; public void back

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1