汉诺塔解析附上代码
1問題描述?
問題提出:有三個塔(分別為A號,B號和C號)。開始時.有?
n個圓形盤以從下到上、從大到小的次序疊置在A塔上。現要將A?
塔上的所有圓形盤,借助B搭,全部移動到C搭上。且仍按照原來?
的次序疊置。?
移動的規則如下:這些圓形盤只能在3個塔問進行移動.一?
次只能移動一個盤子,且任何時候都不允許將較大的盤子壓在比?
它小的盤子的上面。?
要求如下:從鍵盤輸入初始圓形盤子個數n.用JAVA實現n?
個盤子最佳移動的全過程。?
2算法分析?
此題的目的是設計一個盤子移動的方案.使得A號塔上的所?
有盤子借助于B號塔按照原來的次序移動到C號塔上,并且.要?
給出完整的最佳的盤子移動的方案。?
我們從實際的、具體的盤子的移動過程來分析.找出問題內?
在的規律。經分析無論盤子的個數有多少.是1、2、3..或n個.?
也不管我們怎么去移動盤子(當然是按規則來移動).但在移動的?
過程中,將始終會出現這樣的狀態情況:(n一1)個盤子將會以從下?
到上、從大到下的次序疊置在B塔上,這時,A塔上第n個盤子就?
能被輕而易舉疊放到c塔上;接著,我們再把B塔上的其fn一1)十?
盤子移動到C塔上,問靼好像已經解決?
但,B塔上fn—1)個盤子怎么移動到C塔上呢?這是我們要解?
決的第二個問題。同樣,不管我們怎么移動,也將會出現這樣的狀?
態情況:(n一2)個盤子將會以從上到下、從大到小的次序疊置在A?
塔上,這時。B塔上第(n一1)個盤子就能被輕而易舉放到C塔上;接?
著,我們把A塔上的共(n一2)個盤子移動到C塔上。?
這樣,不斷深入,不斷細小化,最終,將到達僅有一個盤的情?
形。這時,遞歸也就終止了,問題也得到了解決。通過以上分析.這?
里有很明顯遞歸關系?
由此,想到了采用遞歸算法來解決該問題。因為遞歸算法有這?
樣特征描述:為了求解出規模力N的問題的解.我們先設法將它分?
解成一些規模較小的問題,然后從這些較小問題的解能方便地構?
造出大問題的解,并且這些規模較小的問題也能采用同樣的方法?
分解,分解成規模更小的問題,并能從這些更小的問題的解構造出?
規模稍大問題的解。特別地是,當規模N-I時,能直接得到解。?
現在,嚴格按照遞歸算法來解決問題。先定義遞歸方法Hanio?
(int N,char A,char B,char C),按如下步驟進行解題(設初始盤子個?
數為N):若A塔上僅僅只有一個盤子(N=1),則直接從A移動到?
C,問題完全解決。若A塔上有一個以上的盤子(N>1),則需要考慮以下三個步驟。?
第一步:把 一1)個盤子從A塔經過移動,疊放到B塔上。在?
不違反規則情況下,所有fN一1)個盤子不能作為一個整體一起移?
動,而是要符合要求地從一個塔移到另一個塔上。用Hanio(N—1.A,?
C,B)調用遞歸方法,注意:這里是借助于C塔,將(N一1)個盤子從A?
塔移動到B塔,A是源塔,B是目標塔。?
第二步:將剩下的第N個盤子(也就是最底下的一個)直接從A塔?
疊放到空著的C塔上。?
第三步 用第一步的方法,再次將B塔上的所有盤子疊放到?
C塔上。同樣,這一步實際上也是由一系列更小的符合規則的移動?
盤子的操作組成的。用Hanio(N一1,B,A,C)調用遞歸方法,注意:這?
里是借助于A塔,將(N—1)個盤子從B塔移動到C塔,B是源塔,℃?
是目標塔。?
這個算法達到了預期的目標.即在C塔上按正確的次序疊放?
了所有的圓形盤子。有了前面問題算j去分析的基礎,繼而,我們可?
問題提出:有三個塔(分別為A號,B號和C號)。開始時.有?
n個圓形盤以從下到上、從大到小的次序疊置在A塔上。現要將A?
塔上的所有圓形盤,借助B搭,全部移動到C搭上。且仍按照原來?
的次序疊置。?
移動的規則如下:這些圓形盤只能在3個塔問進行移動.一?
次只能移動一個盤子,且任何時候都不允許將較大的盤子壓在比?
它小的盤子的上面。?
要求如下:從鍵盤輸入初始圓形盤子個數n.用JAVA實現n?
個盤子最佳移動的全過程。?
2算法分析?
此題的目的是設計一個盤子移動的方案.使得A號塔上的所?
有盤子借助于B號塔按照原來的次序移動到C號塔上,并且.要?
給出完整的最佳的盤子移動的方案。?
我們從實際的、具體的盤子的移動過程來分析.找出問題內?
在的規律。經分析無論盤子的個數有多少.是1、2、3..或n個.?
也不管我們怎么去移動盤子(當然是按規則來移動).但在移動的?
過程中,將始終會出現這樣的狀態情況:(n一1)個盤子將會以從下?
到上、從大到下的次序疊置在B塔上,這時,A塔上第n個盤子就?
能被輕而易舉疊放到c塔上;接著,我們再把B塔上的其fn一1)十?
盤子移動到C塔上,問靼好像已經解決?
但,B塔上fn—1)個盤子怎么移動到C塔上呢?這是我們要解?
決的第二個問題。同樣,不管我們怎么移動,也將會出現這樣的狀?
態情況:(n一2)個盤子將會以從上到下、從大到小的次序疊置在A?
塔上,這時。B塔上第(n一1)個盤子就能被輕而易舉放到C塔上;接?
著,我們把A塔上的共(n一2)個盤子移動到C塔上。?
這樣,不斷深入,不斷細小化,最終,將到達僅有一個盤的情?
形。這時,遞歸也就終止了,問題也得到了解決。通過以上分析.這?
里有很明顯遞歸關系?
由此,想到了采用遞歸算法來解決該問題。因為遞歸算法有這?
樣特征描述:為了求解出規模力N的問題的解.我們先設法將它分?
解成一些規模較小的問題,然后從這些較小問題的解能方便地構?
造出大問題的解,并且這些規模較小的問題也能采用同樣的方法?
分解,分解成規模更小的問題,并能從這些更小的問題的解構造出?
規模稍大問題的解。特別地是,當規模N-I時,能直接得到解。?
現在,嚴格按照遞歸算法來解決問題。先定義遞歸方法Hanio?
(int N,char A,char B,char C),按如下步驟進行解題(設初始盤子個?
數為N):若A塔上僅僅只有一個盤子(N=1),則直接從A移動到?
C,問題完全解決。若A塔上有一個以上的盤子(N>1),則需要考慮以下三個步驟。?
第一步:把 一1)個盤子從A塔經過移動,疊放到B塔上。在?
不違反規則情況下,所有fN一1)個盤子不能作為一個整體一起移?
動,而是要符合要求地從一個塔移到另一個塔上。用Hanio(N—1.A,?
C,B)調用遞歸方法,注意:這里是借助于C塔,將(N一1)個盤子從A?
塔移動到B塔,A是源塔,B是目標塔。?
第二步:將剩下的第N個盤子(也就是最底下的一個)直接從A塔?
疊放到空著的C塔上。?
第三步 用第一步的方法,再次將B塔上的所有盤子疊放到?
C塔上。同樣,這一步實際上也是由一系列更小的符合規則的移動?
盤子的操作組成的。用Hanio(N一1,B,A,C)調用遞歸方法,注意:這?
里是借助于A塔,將(N—1)個盤子從B塔移動到C塔,B是源塔,℃?
是目標塔。?
這個算法達到了預期的目標.即在C塔上按正確的次序疊放?
了所有的圓形盤子。有了前面問題算j去分析的基礎,繼而,我們可?
以用JAVA來實現算法。?
package hannuota;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Maintest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;
System.out.print("intput n:");
try {
BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
n=Integer.valueOf(bReader.readLine());
move(n,'a','b','c');
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void move(int n,char a,char b,char c)
{
if(n==1)
{
System.out.println(a+"->"+c);
}
else{
move(n-1, a, c, b);
System.out.println(a+"->"+c);
move(n-1, b, a, c);
}
}
}
轉載于:https://www.cnblogs.com/fjsh925907195/p/4138849.html
總結
- 上一篇: opengles 2.0 点精灵 多边形
- 下一篇: 48.检测对象是否为空