河內塔程式by Java(第一Po)
資訊領域,po在網路上的第一個程式,河內塔,
利用字元陣列abcd...來模擬河內塔的盤子搬移,a>b>c>d>...。
//河內塔程式,使用字元陣列的方式,宣告A, B, C三根柱子,
//將所需數量的abcd...放入A柱子(A字元陣列),將之全部一個一個移到到C柱,此間小寫字母小的一定要在大的前面
//也就是a代表最大的盤子
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//河內塔類別
public class ch01_11_hanoi {
//三個靜態字元陣列
static char A[];
static char B[];
static char C[];
//主程式,避免輸入格式錯誤,所以拋出例外
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
//輸入您想要的盤子數量
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
System.out.println("plz input how many disks you need:");
int number=Integer.parseInt(buf.readLine());
//將A, B, C柱裡面的盤子初始化,也就是把小寫字母放進去
initialize(number);
//印出初始化後的狀態
for(int i=0;i<A.length;i++)
System.out.print(A[i]);
System.out.println();
for(int i=0;i<B.length;i++)
System.out.print(B[i]);
System.out.println();
for(int i=0;i<C.length;i++)
System.out.print(C[i]);
System.out.println();
//開始執行河內塔移動盤子的過程,呼叫河內塔函式,將A, B, C的記憶體內容交給hanoi執行
hanoi(A, B, C, number);
}
//初始化函式
public static void initialize(int n){
A=new char[n];
for(int i=0;i<A.length;i++)
A[i]=(char) (97+i);
B=new char[n];
C=new char[n];
}
//河內塔遞迴函式,不斷地將A, B, C指標的記憶體內容交給所要的ori, temp, des陣列,達到指向同一個陣列,其中函式的引數一定要跟回呼的參數相同
public static void hanoi(char ori[], char temp[], char des[], int n){
if(n==1){
move(ori, des);
//印出移動結果
for(int i=0;i<A.length;i++)
System.out.print(A[i]);
System.out.println();
for(int i=0;i<B.length;i++)
System.out.print(B[i]);
System.out.println();
for(int i=0;i<C.length;i++)
System.out.print(C[i]);
System.out.println();
//休眠3秒
try
{
Thread.sleep(3500);
}
catch(InterruptedException e){}
}
//第一次移動n-1個盤子到B柱,第二次移動1個盤子到C柱,第三次移動n-1個盤子到C柱,完成遞迴呼叫順序
else{
hanoi(ori, des , temp, n-1);
hanoi(ori, temp, des, 1);
hanoi(temp, ori, des, n-1);
}
}
//移動盤子的函式,將ori_list中的其中一個盤子移到des_list中,並且刪除掉原本在ori_list中的紀錄
public static void move(char ori_list[], char des_list[]){
int i=1, j=0;
while(ori_list[ori_list.length-i]=='\u0000')
i++;
while(des_list[j]!='\u0000')
j++;
des_list[j]=ori_list[ori_list.length-i];
ori_list[ori_list.length-i]='\u0000';
}
}
利用字元陣列abcd...來模擬河內塔的盤子搬移,a>b>c>d>...。
//河內塔程式,使用字元陣列的方式,宣告A, B, C三根柱子,
//將所需數量的abcd...放入A柱子(A字元陣列),將之全部一個一個移到到C柱,此間小寫字母小的一定要在大的前面
//也就是a代表最大的盤子
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
//河內塔類別
public class ch01_11_hanoi {
//三個靜態字元陣列
static char A[];
static char B[];
static char C[];
//主程式,避免輸入格式錯誤,所以拋出例外
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
//輸入您想要的盤子數量
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
System.out.println("plz input how many disks you need:");
int number=Integer.parseInt(buf.readLine());
//將A, B, C柱裡面的盤子初始化,也就是把小寫字母放進去
initialize(number);
//印出初始化後的狀態
for(int i=0;i<A.length;i++)
System.out.print(A[i]);
System.out.println();
for(int i=0;i<B.length;i++)
System.out.print(B[i]);
System.out.println();
for(int i=0;i<C.length;i++)
System.out.print(C[i]);
System.out.println();
//開始執行河內塔移動盤子的過程,呼叫河內塔函式,將A, B, C的記憶體內容交給hanoi執行
hanoi(A, B, C, number);
}
//初始化函式
public static void initialize(int n){
A=new char[n];
for(int i=0;i<A.length;i++)
A[i]=(char) (97+i);
B=new char[n];
C=new char[n];
}
//河內塔遞迴函式,不斷地將A, B, C指標的記憶體內容交給所要的ori, temp, des陣列,達到指向同一個陣列,其中函式的引數一定要跟回呼的參數相同
public static void hanoi(char ori[], char temp[], char des[], int n){
if(n==1){
move(ori, des);
//印出移動結果
for(int i=0;i<A.length;i++)
System.out.print(A[i]);
System.out.println();
for(int i=0;i<B.length;i++)
System.out.print(B[i]);
System.out.println();
for(int i=0;i<C.length;i++)
System.out.print(C[i]);
System.out.println();
//休眠3秒
try
{
Thread.sleep(3500);
}
catch(InterruptedException e){}
}
//第一次移動n-1個盤子到B柱,第二次移動1個盤子到C柱,第三次移動n-1個盤子到C柱,完成遞迴呼叫順序
else{
hanoi(ori, des , temp, n-1);
hanoi(ori, temp, des, 1);
hanoi(temp, ori, des, n-1);
}
}
//移動盤子的函式,將ori_list中的其中一個盤子移到des_list中,並且刪除掉原本在ori_list中的紀錄
public static void move(char ori_list[], char des_list[]){
int i=1, j=0;
while(ori_list[ori_list.length-i]=='\u0000')
i++;
while(des_list[j]!='\u0000')
j++;
des_list[j]=ori_list[ori_list.length-i];
ori_list[ori_list.length-i]='\u0000';
}
}
留言
張貼留言