Java算法之经典题目篇.docx

上传人:b****4 文档编号:5194847 上传时间:2022-12-13 格式:DOCX 页数:19 大小:24.49KB
下载 相关 举报
Java算法之经典题目篇.docx_第1页
第1页 / 共19页
Java算法之经典题目篇.docx_第2页
第2页 / 共19页
Java算法之经典题目篇.docx_第3页
第3页 / 共19页
Java算法之经典题目篇.docx_第4页
第4页 / 共19页
Java算法之经典题目篇.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

Java算法之经典题目篇.docx

《Java算法之经典题目篇.docx》由会员分享,可在线阅读,更多相关《Java算法之经典题目篇.docx(19页珍藏版)》请在冰豆网上搜索。

Java算法之经典题目篇.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

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

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