汉诺塔问题? 汉诺塔的问题?
\u6c49\u8bfa\u5854\u95ee\u9898\u3000\u3000\u6c49\u8bfa\u5854\uff08\u53c8\u79f0\u6cb3\u5185\u5854\uff09\u95ee\u9898\u662f\u5370\u5ea6\u7684\u4e00\u4e2a\u53e4\u8001\u7684\u4f20\u8bf4\u3002\u5f00\u5929\u8f9f\u5730\u7684\u795e\u52c3\u62c9\u739b\u5728\u4e00\u4e2a\u5e99\u91cc\u7559\u4e0b\u4e86\u4e09\u6839\u91d1\u521a\u77f3\u7684\u68d2\uff0c\u7b2c\u4e00\u6839\u4e0a\u9762\u5957\u774064\u4e2a\u5706\u7684\u91d1\u7247\uff0c\u6700\u5927\u7684\u4e00\u4e2a\u5728\u5e95\u4e0b\uff0c\u5176\u4f59\u4e00\u4e2a\u6bd4\u4e00\u4e2a\u5c0f\uff0c\u4f9d\u6b21\u53e0\u4e0a\u53bb\uff0c\u5e99\u91cc\u7684\u4f17\u50e7\u4e0d\u5026\u5730\u628a\u5b83\u4eec\u4e00\u4e2a\u4e2a\u5730\u4ece\u8fd9\u6839\u68d2\u642c\u5230\u53e6\u4e00\u6839\u68d2\u4e0a\uff0c\u89c4\u5b9a\u53ef\u5229\u7528\u4e2d\u95f4\u7684\u4e00\u6839\u68d2\u4f5c\u4e3a\u5e2e\u52a9\uff0c\u4f46\u6bcf\u6b21\u53ea\u80fd\u642c\u4e00\u4e2a\uff0c\u800c\u4e14\u5927\u7684\u4e0d\u80fd\u653e\u5728\u5c0f\u7684\u4e0a\u9762\u3002\u89e3\u7b54\u7ed3\u679c\u8bf7\u81ea\u5df1\u8fd0\u884c\u8ba1\u7b97\uff0c\u7a0b\u5e8f\u89c1\u5c3e\u90e8\u3002\u9762\u5bf9\u5e9e\u5927\u7684\u6570\u5b57(\u79fb\u52a8\u5706\u7247\u7684\u6b21\u6570)18446744073709551615\uff0c\u770b\u6765\uff0c\u4f17\u50e7\u4eec\u8017\u5c3d\u6bd5\u751f\u7cbe\u529b\u4e5f\u4e0d\u53ef\u80fd\u5b8c\u6210\u91d1\u7247\u7684\u79fb\u52a8\u3002
\u3000\u3000\u540e\u6765\uff0c\u8fd9\u4e2a\u4f20\u8bf4\u5c31\u6f14\u53d8\u4e3a\u6c49\u8bfa\u5854\u6e38\u620f:
\u3000\u30001.\u6709\u4e09\u6839\u6746\u5b50A,B,C\u3002A\u6746\u4e0a\u6709\u82e5\u5e72\u789f\u5b50
\u3000\u30002.\u6bcf\u6b21\u79fb\u52a8\u4e00\u5757\u789f\u5b50,\u5c0f\u7684\u53ea\u80fd\u53e0\u5728\u5927\u7684\u4e0a\u9762
\u3000\u30003.\u628a\u6240\u6709\u789f\u5b50\u4eceA\u6746\u5168\u90e8\u79fb\u5230C\u6746\u4e0a
\u3000\u3000\u7ecf\u8fc7\u7814\u7a76\u53d1\u73b0\uff0c\u6c49\u8bfa\u5854\u7684\u7834\u89e3\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u6309\u7167\u79fb\u52a8\u89c4\u5219\u5411\u4e00\u4e2a\u65b9\u5411\u79fb\u52a8\u91d1\u7247\uff1a
\u3000\u3000\u59823\u9636\u6c49\u8bfa\u5854\u7684\u79fb\u52a8\uff1aA\u2192C,A\u2192B,C\u2192B,A\u2192C,B\u2192A,B\u2192C,A\u2192C
\u3000\u3000\u6b64\u5916\uff0c\u6c49\u8bfa\u5854\u95ee\u9898\u4e5f\u662f\u7a0b\u5e8f\u8bbe\u8ba1\u4e2d\u7684\u7ecf\u5178\u9012\u5f52\u95ee\u9898\u3002
\u3000\u3000\u7b97\u6cd5\u601d\u8def\uff1a
\u3000\u30001.\u5982\u679c\u53ea\u6709\u4e00\u4e2a\u91d1\u7247\uff0c\u5219\u628a\u8be5\u91d1\u7247\u4ece\u6e90\u79fb\u52a8\u5230\u76ee\u6807\u68d2\uff0c\u7ed3\u675f\u3002
\u3000\u30002.\u5982\u679c\u6709n\u4e2a\u91d1\u7247\uff0c\u5219\u628a\u524dn-1\u4e2a\u91d1\u7247\u79fb\u52a8\u5230\u8f85\u52a9\u7684\u68d2\uff0c\u7136\u540e\u628a\u81ea\u5df1\u79fb\u52a8\u5230\u76ee\u6807\u68d2\uff0c\u6700\u540e\u518d\u628a\u524dn-1\u4e2a\u79fb\u52a8\u5230\u76ee\u6807\u68d2
\u3000\u3000(\u975e\u4e13\u4e1a\u4eba\u58eb\u53ef\u4ee5\u5ffd\u7565\u4ee5\u4e0b\u5185\u5bb9)
\u3000\u3000\u8865\u5145\uff1a\u6c49\u8bfa\u5854\u7684\u7b97\u6cd5\u5b9e\u73b0\uff08c++\uff09
\u3000\u3000#include
\u3000\u3000#include
\u3000\u3000using namespace std;
\u3000\u3000ofstream fout("out.txt");
\u3000\u3000void Move(int n,char x,char y)
\u3000\u3000{
\u3000\u3000fout<<"\u628a"<<n<<"\u53f7\u4ece"<<x<<"\u632a\u52a8\u5230"<<y<<endl;
\u3000\u3000}
\u3000\u3000void Hannoi(int n,char a,char b,char c)
\u3000\u3000{
\u3000\u3000if(n==1)
\u3000\u3000Move(1,a,c);
\u3000\u3000else
\u3000\u3000{
\u3000\u3000Hannoi(n-1,a,c,b);
\u3000\u3000Move(n,a,c);
\u3000\u3000Hannoi(n-1,b,a,c);
\u3000\u3000}
\u3000\u3000}
\u3000\u3000int main()
\u3000\u3000{
\u3000\u3000fout<<"\u4ee5\u4e0b\u662f7\u5c42\u6c49\u8bfa\u5854\u7684\u89e3\u6cd5:"<<endl;
\u3000\u3000Hannoi(7,'a','b','c');
\u3000\u3000fout.close();
\u3000\u3000cout<<"\u8f93\u51fa\u5b8c\u6bd5\uff01"<<endl;
\u3000\u3000return 0;
\u3000\u3000}
\u3000\u3000C\u8bed\u8a00\u7cbe\u7b80\u7b97\u6cd5
\u3000\u3000/* Copyrighter by SS7E */
\u3000\u3000#include /* Copyrighter by SS7E */
\u3000\u3000void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */
\u3000\u3000{
\u3000\u3000if(n==1)
\u3000\u3000{
\u3000\u3000printf("Move disk %d from %c to %c\n",n,A,C);
\u3000\u3000}
\u3000\u3000else
\u3000\u3000{
\u3000\u3000hanoi(n-1,A,C,B); /* Copyrighter by SS7E */
\u3000\u3000printf("Move disk %d from %c to %c\n",n,A,C);
\u3000\u3000hanoi(n-1,B,A,C); /* Copyrighter by SS7E */
\u3000\u3000}
\u3000\u3000}
\u3000\u3000main() /* Copyrighter by SS7E */
\u3000\u3000{
\u3000\u3000int n;
\u3000\u3000printf("\u8bf7\u8f93\u5165\u6570\u5b57n\u4ee5\u89e3\u51b3n\u9636\u6c49\u8bfa\u5854\u95ee\u9898\uff1a\n");
\u3000\u3000scanf("%d",&n);
\u3000\u3000hanoi(n,'A','B','C');
\u3000\u3000}/* Copyrighter by SS7E */
\u3000\u3000PHP\u7b97\u6cd5\uff1a
\u3000\u3000<?php
\u3000\u3000function hanoi($n,$x,$y,$z){
\u3000\u3000if($n==1){
\u3000\u3000move($x,1,$z);
\u3000\u3000}else{
\u3000\u3000hanoi($n-1,$x,$z,$y);
\u3000\u3000move($x,$n,$z);
\u3000\u3000hanoi($n-1,$y,$x,$z);
\u3000\u3000}
\u3000\u3000}
\u3000\u3000function move($x,$n,$z){
\u3000\u3000echo 'move disk '.$n.' from '.$x.' to '.$z.'';
\u3000\u3000}
\u3000\u3000hanoi(10,'x','y','z');
\u3000\u3000?>
\u3000\u3000JAVA\u7b97\u6cd5\uff1a
\u3000\u3000public class Haniojava
\u3000\u3000{
\u3000\u3000public static void main(String args[])
\u3000\u3000{
\u3000\u3000byte n=2;
\u3000\u3000char a='A',b='B',c='C';
\u3000\u3000hanio(n,a,b,c);
\u3000\u3000}
\u3000\u3000public static void hanio(byte n,char a,char b,char c)
\u3000\u3000{
\u3000\u3000if(n==1)
\u3000\u3000System.out.println("move "+a+" to "+b);
\u3000\u3000else
\u3000\u3000{
\u3000\u3000hanio((byte)(n-1),a,c,b);
\u3000\u3000System.out.println("move "+a+" to "+b);
\u3000\u3000hanio((byte)(n-1),c,b,a);
\u3000\u3000}
\u3000\u3000}
\u3000\u3000}
\u3000\u3000#include
\u3000\u3000void move(char ch1, char ch2) {
\u3000\u3000cout"<<ch2<<' ';
\u3000\u3000}
\u3000\u3000void hanoi(int n, char a, char b, char c) {
\u3000\u3000if (n==1)
\u3000\u3000move (a,c);
\u3000\u3000else {
\u3000\u3000hanoi (n-1,a,c,b);
\u3000\u3000move (a,c);
\u3000\u3000hanoi (n-1,b,a,c);
\u3000\u3000}
\u3000\u3000}
\u3000\u3000void main() {
\u3000\u3000int m;
\u3000\u3000cout<<"Enter the number of disk to move:\n";
\u3000\u3000cin>>m;
\u3000\u3000cout<<"The step to moving "<<m<<" disk:\n";
\u3000\u3000hanoi (m,'A','B','C');
\u3000\u3000cin>>m;
\u3000\u3000}
\u3000\u3000\u7528\u4e0d\u4e86\u8fd9\u4e48\u590d\u6742
\u3000\u3000\uff0c\u8bbeA\u4e0a\u6709n\u4e2a\u76d8\u5b50\u3002
\u3000\u3000\u5982\u679cn=1\uff0c\u5219\u5c06\u5706\u76d8\u4eceA\u76f4\u63a5\u79fb\u52a8\u5230C\u3002
\u3000\u3000\u5982\u679cn=2\uff0c\u5219\uff1a
\u3000\u30001.\u5c06A\u4e0a\u7684n-1(\u7b49\u4e8e1)\u4e2a\u5706\u76d8\u79fb\u5230B\u4e0a\uff1b
\u3000\u30002.\u518d\u5c06A\u4e0a\u7684\u4e00\u4e2a\u5706\u76d8\u79fb\u5230C\u4e0a\uff1b
\u3000\u30003.\u6700\u540e\u5c06B\u4e0a\u7684n-1(\u7b49\u4e8e1)\u4e2a\u5706\u76d8\u79fb\u5230C\u4e0a\u3002
\u3000\u3000\u5982\u679cn=3\uff0c\u5219\uff1a
\u3000\u3000A. \u5c06A\u4e0a\u7684n-1(\u7b49\u4e8e2\uff0c\u4ee4\u5176\u4e3an`)\u4e2a\u5706\u76d8\u79fb\u5230B(\u501f\u52a9\u4e8eC)\uff0c\u6b65\u9aa4\u5982\u4e0b\uff1a
\u3000\u3000(1)\u5c06A\u4e0a\u7684n`-1(\u7b49\u4e8e1)\u4e2a\u5706\u76d8\u79fb\u5230C\u4e0a\u3002
\u3000\u3000(2)\u5c06A\u4e0a\u7684\u4e00\u4e2a\u5706\u76d8\u79fb\u5230B\u3002
\u3000\u3000(3)\u5c06C\u4e0a\u7684n`-1(\u7b49\u4e8e1)\u4e2a\u5706\u76d8\u79fb\u5230B\u3002
\u3000\u3000B. \u5c06A\u4e0a\u7684\u4e00\u4e2a\u5706\u76d8\u79fb\u5230C\u3002
\u3000\u3000C. \u5c06B\u4e0a\u7684n-1(\u7b49\u4e8e2\uff0c\u4ee4\u5176\u4e3an`)\u4e2a\u5706\u76d8\u79fb\u5230C(\u501f\u52a9A)\uff0c\u6b65\u9aa4\u5982\u4e0b\uff1a
\u3000\u3000(1)\u5c06B\u4e0a\u7684n`-1(\u7b49\u4e8e1)\u4e2a\u5706\u76d8\u79fb\u5230A\u3002
\u3000\u3000(2)\u5c06B\u4e0a\u7684\u4e00\u4e2a\u76d8\u5b50\u79fb\u5230C\u3002
\u3000\u3000(3)\u5c06A\u4e0a\u7684n`-1(\u7b49\u4e8e1)\u4e2a\u5706\u76d8\u79fb\u5230C\u3002
\u3000\u3000\u5230\u6b64\uff0c\u5b8c\u6210\u4e86\u4e09\u4e2a\u5706\u76d8\u7684\u79fb\u52a8\u8fc7\u7a0b\u3002
\u3000\u3000\u4ece\u4e0a\u9762\u5206\u6790\u53ef\u4ee5\u770b\u51fa\uff0c\u5f53n\u5927\u4e8e\u7b49\u4e8e2\u65f6\uff0c\u79fb\u52a8\u7684\u8fc7\u7a0b\u53ef\u5206\u89e3\u4e3a\u4e09\u4e2a\u6b65\u9aa4\uff1a
\u3000\u3000\u7b2c\u4e00\u6b65 \u628aA\u4e0a\u7684n-1\u4e2a\u5706\u76d8\u79fb\u5230B\u4e0a\uff1b
\u3000\u3000\u7b2c\u4e8c\u6b65 \u628aA\u4e0a\u7684\u4e00\u4e2a\u5706\u76d8\u79fb\u5230C\u4e0a\uff1b
\u3000\u3000\u7b2c\u4e09\u6b65 \u628aB\u4e0a\u7684n-1\u4e2a\u5706\u76d8\u79fb\u5230C\u4e0a\uff1b\u5176\u4e2d\u7b2c\u4e00\u6b65\u548c\u7b2c\u4e09\u6b65\u662f\u7c7b\u540c\u7684\u3002
\u3000\u3000\u5f53n=3\u65f6\uff0c\u7b2c\u4e00\u6b65\u548c\u7b2c\u4e09\u6b65\u53c8\u5206\u89e3\u4e3a\u7c7b\u540c\u7684\u4e09\u6b65\uff0c\u5373\u628an`-1\u4e2a\u5706\u76d8\u4ece\u4e00\u4e2a\u9488\u79fb\u5230\u53e6\u4e00\u4e2a\u9488\u4e0a\uff0c\u8fd9\u91cc\u7684n`=n-1\u3002 \u663e\u7136\u8fd9\u662f\u4e00\u4e2a\u9012\u5f52\u8fc7\u7a0b\uff0c\u636e\u6b64\u7b97\u6cd5\u53ef\u7f16\u7a0b\u5982\u4e0b\uff1a
\u3000\u3000move(int n,int x,int y,int z)
\u3000\u3000{
\u3000\u3000if(n==1)
\u3000\u3000printf("%c-->%c\n",x,z);
\u3000\u3000else
\u3000\u3000{
\u3000\u3000move(n-1,x,z,y);
\u3000\u3000printf("%c-->%c\n",x,z);
\u3000\u3000move(n-1,y,x,z);
\u3000\u3000}
\u3000\u3000}
\u3000\u3000main()
\u3000\u3000{
\u3000\u3000int h;
\u3000\u3000printf("\ninput number:\n");
\u3000\u3000scanf("%d",&h);
\u3000\u3000printf("the step to moving %2d diskes:\n",h);
\u3000\u3000move(h,'a','b','c');
\u3000\u3000}
\u5e0c\u5b9c\u9601\uff0c\u8bb0\u5fc6\u4e2d\u4f3c\u4e4e\u4ece\u6ca1\u6709\u542c\u8fc7\u8fd9\u4e2a\u5730\u65b9\u3002\u5f53\u521d\u5218\u59d1\u59d1\u6559\u4e60\u5bab\u4e2d\u793c\u4eea\u65f6\u6ca1\u6709\u63d0\u5230\u8fd9\u4e2a\u5730\u65b9\uff0c\u6df7\u5728\u7687\u5bab\u7684\u8fd9\u4e9b\u65e5\u5b50\uff0c\u989c\u6708\u4e5f\u6ca1\u6709\u7559\u610f\u8fc7\u8fd9\u4e2a\u5730\u65b9\u3002\u4f1a\u6709\u4ec0\u4e48\u66f4\u5927\u7684\u6069\u5178\u5728\u5e0c\u5b9c\u9601\uff1f\u989c\u6708\u5e76\u4e0d\u60f3\u8981\u4ec0\u4e48\u6069\u5178\uff0c\u5374\u4e5f\u53ea\u80fd\u5411\u7740\u90a3\u5e0c\u5b9c\u9601\u7684\u65b9\u5411\u8d70\u53bb\u3002\u5728\u7684\u5417 \u989c\u6708\u5fc3\u4e2d\u9ad8\u5174\uff0c\u6e05\u4e86\u6e05\u566a\u5b50\uff0c\u5f00\u59cb\u7ed8\u58f0\u7ed8\u8272\u5730\u8bb2\u4e86\u8d77\u6765\uff1a\u6709\u4e00\u6761\u4fee\u7ec3\u5343\u5e74\u7684\u767d\u86c7\u540d\u53eb\u767d\u7d20\u8d1e\uff0c\u5979\u7fa1\u6155\u6781\u4e86\u4eba\u95f4\u751f\u6d3b\u3002\u6709\u4e00\u5929\u5979\u5316\u8eab\u5c11\u5973\u5230\u897f\u6e56\u6e38\u73a9\uff0c\u9047\u5230\u4e86\u6e29\u6587\u5c14\u96c5\u7684\u4e66\u751f\u8bb8\u4ed9\uff0c\u4e24\u4eba\u56e0\u4e0b\u96e8\u501f\u4f1e\u76f8\u8bc6\uff0c\u8fdb\u800c\u4e92\u76f8\u7231\u6155\u5e76\u7ed3\u4e3a\u592b\u59bb\u3002\u5a5a\u540e\u592b\u59bb\u4fe9\u5f00\u4e86\u4e00\u95f4\u836f\u5e97\uff0c\u56e0\u767d\u7d20\u8d1e\u6cbb\u597d\u4e86\u5f88\u591a\u7684\u7591\u96be\u6742\u75c7\uff0c\u836f\u5e97\u7684\u751f\u610f\u8d8a\u6765\u8d8a\u7ea2\u706b\u3002\u53ef\u662f\uff0c\u8fd9\u4e00\u5207\u5374\u5f97\u7f6a\u4e86\u91d1\u5c71\u5bfa\u6cd5\u6d77\u548c\u5c1a\u3002\u56e0\u4e3a\u4eba\u4eec\u7684\u75c5\u90fd\u88ab\u767d\u7d20\u8d1e\u6cbb\u597d\u4e86\uff0c\u5230\u91d1\u5c71\u5bfa\u70e7\u9999\u6c42\u83e9\u8428\u7684\u4eba\u5c31\u5c11\u591a\u4e86\u3002\u800c\u4ed6\u53d1\u73b0\u767d\u7d20\u8d1e\u662f\u767d\u86c7\u4e4b\u8eab\u540e\uff0c\u4fbf\u60f3\u65b9\u8bbe\u6cd5\u7834\u574f\u8bb8\u4ed9\u548c\u767d\u5a18\u5b50\u7684\u611f\u60c5\uff0c\u53ef\u8bb8\u4ed9\u5bf9\u59bb\u5b50\u7684\u7231\u6df1\u60c5\u6d53\uff0c\u5373\u4f7f\u59bb\u5b50\u662f\u86c7\u5996\u4e5f\u4e0d\u613f\u610f\u4e0e\u5979\u5206\u5f00\u3002\u6cd5\u6d77\u4e00\u6c14\u4e4b\u4e0b\uff0c\u628a\u8bb8\u4ed9\u63b3\u8d70\uff0c\u85cf\u4e8e\u91d1\u5c71\u5bfa\u3002\u7f8e\u4e3d\u7684\u767d\u5a18\u5b50\u4e3a\u4e86\u5411\u6cd5\u6d77\u8ba8\u8fd8\u4e08\u592b\uff0c\u6765\u4e86\u4e2a\u6c34\u6f2b\u91d1\u5c71\uff0c\u53ef\u7ec8\u7a76\u4e0d\u654c\u6cd5\u6d77\u548c\u5c1a\uff0c\u88ab\u9547\u538b\u5728\u96f7\u5cf0\u5854\u4e2d\u3002
汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。后来,这个传说就演变为汉诺塔游戏:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
此外,汉诺塔问题也是程序设计中的经典递归问题。
算法思路:
1.如果只有一个金片,则把该金片从源移动到目标棒,结束。
2.如果有n个金片,则把前n-1个金片移动到辅助的棒,然后把自己移动到目标棒,最后再把前n-1个移动到目标棒
(非专业人士可以忽略以下内容)
补充:汉诺塔的算法实现(c++)
#include
#include
using namespace std;
ofstream fout("out.txt");
void Move(int n,char x,char y)
{
fout<<"把"<<n<<"号从"<<x<<"挪动到"<<y<<endl;
}
void Hannoi(int n,char a,char b,char c)
{
if(n==1)
Move(1,a,c);
else
{
Hannoi(n-1,a,c,b);
Move(n,a,c);
Hannoi(n-1,b,a,c);
}
}
int main()
{
fout<<"以下是7层汉诺塔的解法:"<<endl;
Hannoi(7,'a','b','c');
fout.close();
cout<<"输出完毕!"<<endl;
return 0;
}
C语言精简算法
/* Copyrighter by SS7E */
#include /* Copyrighter by SS7E */
void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */
{
if(n==1)
{
printf("Move disk %d from %c to %c\n",n,A,C);
}
else
{
hanoi(n-1,A,C,B); /* Copyrighter by SS7E */
printf("Move disk %d from %c to %c\n",n,A,C);
hanoi(n-1,B,A,C); /* Copyrighter by SS7E */
}
}
main() /* Copyrighter by SS7E */
{
int n;
printf("请输入数字n以解决n阶汉诺塔问题:\n");
scanf("%d",&n);
hanoi(n,'A','B','C');
}/* Copyrighter by SS7E */
PHP算法:
<?php
function hanoi($n,$x,$y,$z){
if($n==1){
move($x,1,$z);
}else{
hanoi($n-1,$x,$z,$y);
move($x,$n,$z);
hanoi($n-1,$y,$x,$z);
}
}
function move($x,$n,$z){
echo 'move disk '.$n.' from '.$x.' to '.$z.'
';
}
hanoi(10,'x','y','z');
?>
JAVA算法:
public class Haniojava
{
public static void main(String args[])
{
byte n=2;
char a='A',b='B',c='C';
hanio(n,a,b,c);
}
public static void hanio(byte n,char a,char b,char c)
{
if(n==1)
System.out.println("move "+a+" to "+b);
else
{
hanio((byte)(n-1),a,c,b);
System.out.println("move "+a+" to "+b);
hanio((byte)(n-1),c,b,a);
}
}
}
#include
void move(char ch1, char ch2) {
cout<<ch1<"<<ch2<<' ';
}
void hanoi(int n, char a, char b, char c) {
if (n==1)
move (a,c);
else {
hanoi (n-1,a,c,b);
move (a,c);
hanoi (n-1,b,a,c);
}
}
void main() {
int m;
cout<<"Enter the number of disk to move:\n";
cin>>m;
cout<<"The step to moving "<<m<<" disk:\n";
hanoi (m,'A','B','C');
cin>>m;
}
用不了这么复杂
,设A上有n个盘子。
如果n=1,则将圆盘从A直接移动到C。
如果n=2,则:
1.将A上的n-1(等于1)个圆盘移到B上;
2.再将A上的一个圆盘移到C上;
3.最后将B上的n-1(等于1)个圆盘移到C上。
如果n=3,则:
A. 将A上的n-1(等于2,令其为n`)个圆盘移到B(借助于C),步骤如下:
(1)将A上的n`-1(等于1)个圆盘移到C上。
(2)将A上的一个圆盘移到B。
(3)将C上的n`-1(等于1)个圆盘移到B。
B. 将A上的一个圆盘移到C。
C. 将B上的n-1(等于2,令其为n`)个圆盘移到C(借助A),步骤如下:
(1)将B上的n`-1(等于1)个圆盘移到A。
(2)将B上的一个盘子移到C。
(3)将A上的n`-1(等于1)个圆盘移到C。
到此,完成了三个圆盘的移动过程。
从上面分析可以看出,当n大于等于2时,移动的过程可分解为三个步骤:
第一步 把A上的n-1个圆盘移到B上;
第二步 把A上的一个圆盘移到C上;
第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。
当n=3时,第一步和第三步又分解为类同的三步,即把n`-1个圆盘从一个针移到另一个针上,这里的n`=n-1。 显然这是一个递归过程,据此算法可编程如下:
move(int n,int x,int y,int z)
{
if(n==1)
printf("%c-->%c\n",x,z);
else
{
move(n-1,x,z,y);
printf("%c-->%c\n",x,z);
move(n-1,y,x,z);
}
}
main()
{
int h;
printf("\ninput number:\n");
scanf("%d",&h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
}
就像归纳总结,假设我能将前面n-2个盘子移到C柱的时候,必然可以先将n-2个盘子先移动到B柱,再移动n-1大的盘子到C柱后,再将B柱的n-2个盘子移动到C柱,这样就能使n-1个盘子移动到C柱了,跟移动最后一个盘子的方法一致,B柱和C柱其实是没有什么区别的。
不是一次性把n-1个盘子从A移到C,是要借助B和C,来回倒,最终把n-1个盘子移动到C。是讲的移动思路,不是一次的步骤。
绛旓細姹夎濉旈棶棰樼殑鏃堕棿澶嶆潅搴︿负O(2^n)銆傛椂闂村鏉傚害鐨勮绠楋細鐢ㄩ掑綊鏉ヨВ鍐虫眽璇哄闂鏄潪甯告柟渚跨殑閫夋嫨銆傝鐩樺瓙涓暟涓簄鏃讹紝闇瑕乀(n)姝ワ紝鎶夾鏌卞瓙n-1涓洏瀛愮Щ鍒癇鏌卞瓙锛岄渶瑕乀(n-1)姝ワ紝A鏌卞瓙鏈鍚庝竴涓洏瀛愮Щ鍒癈鏌卞瓙涓姝ワ紝B鏌卞瓙涓妌-1涓洏瀛愮Щ鍒癈鏌卞瓙涓奣(n-1)姝ャ傚緱閫掓帹鍏紡T(n)=2T(n-1)+1銆傛墍浠...
绛旓細姹夎濉旈棶棰橈紙鍙堢О娌冲唴濉旈棶棰橈級鏄牴鎹竴涓紶璇村舰鎴愮殑涓涓棶棰橈細鏈変笁鏍规潌瀛怉锛孊锛孋銆侫鏉嗕笂鏈塏涓(N>1)绌垮瓟鍦嗙洏锛岀洏鐨勫昂瀵哥敱涓嬪埌涓婁緷娆″彉灏忋傝姹傛寜涓嬪垪瑙勫垯灏嗘墍鏈夊渾鐩樼Щ鑷矯鏉嗭細1. 姣忔鍙兘绉诲姩涓涓渾鐩橈紱2. 澶х洏涓嶈兘鍙犲湪灏忕洏涓婇潰銆傛彁绀猴細鍙皢鍦嗙洏涓存椂缃簬B鏉嗭紝涔熷彲灏嗕粠A鏉嗙Щ鍑虹殑鍦嗙洏閲嶆柊绉诲洖A鏉...
绛旓細涔熷氨鏄锛屼竴涓16灞傛眽璇哄锛屽皢鎵鏈夌殑閲戠墖浠庝竴鏍归拡绉诲姩鍚戝彟涓鏍归拡闇瑕65535姝ャ姹夎濉旈棶棰樹笉绠″湪浠讳綍缂栫▼璇█閲岄兘鏄粡鍏搁棶棰锛屾槸閲囩敤閫掑綊绠楁硶鐨勭粡鍏告渚嬨傚浜庨掑綊绠楁硶涓殑宓屽鍑芥暟f锛坣-1锛夋潵璇达紝鍏跺垵濮嬩綅锛岃繃娓′綅锛岀洰鏍囦綅鍙戠敓浜嗗彉鍖栥傛眽璇哄鐗圭偣 娉曞浗鏁板瀹剁埍寰峰崕路鍗㈠崱鏂浘缂栧啓杩囦竴涓嵃搴︾殑鍙よ佷紶璇达細鍦...
绛旓細姹夎濉旈棶棰樻槸鐢紙閫掑綊娉曪級鏂规硶姹傝В鐨勪竴涓吀鍨嬮棶棰銆傞掓帹娉曞拰閫掑綊娉曠殑鍖哄埆 閫掓帹娉曞拰閫掑綊娉曟槸璁$畻鏈虹瀛︿腑甯哥敤鐨勪袱绉嶇畻娉曘傚畠浠兘鏄В鍐抽棶 棰樼殑鏂规硶锛屼絾鏄畠浠殑瀹炵幇鏂瑰紡鍜屾濊矾鏈夋墍涓嶅悓銆傛湰鏂囧皢浠庨掓帹娉 鍜岄掑綊娉曠殑瀹氫箟銆佸疄鐜版柟寮忋佷紭缂虹偣绛夋柟闈㈣繘琛屾瘮杈冿紝浠ヤ究鏇村ソ鍦 鐞嗚В瀹冧滑涔嬮棿鐨勫尯鍒備竴銆侀掓帹娉 ...
绛旓細姹夎濉旇寰嬪叕寮忔槸锛欻锛坘锛=2^k-1銆傛眽璇哄鐨勮寰嬫槸锛氫簩杩涘埗鏁扮殑杩涗綅鍙樺寲瑙勫緥涓庢眽璇哄闂鐨勫鐞嗘濊矾涓鏍枫傛眽璇哄锛屽張绉版渤鍐呭锛屾槸涓涓簮浜庡嵃搴﹀彜鑰佷紶璇寸殑鐩婃櫤鐜╁叿銆傚ぇ姊靛ぉ鍒涢犱笘鐣岀殑鏃跺欏仛浜嗕笁鏍归噾鍒氱煶鏌卞瓙锛屽湪涓鏍规煴瀛愪笂浠庝笅寰涓婃寜鐓уぇ灏忛『搴忔憺鐫64鐗囬粍閲戝渾鐩樸傚ぇ姊靛ぉ鍛戒护濠嗙綏闂ㄦ妸鍦嗙洏浠庝笅闈㈠紑濮嬫寜澶у皬...
绛旓細1267650600228229401496703205376姝ャ姹夎濉旈棶棰姣忓眰鎸姩鐨勬鏁帮紝閮芥槸鐪嬩笂涓灞傜殑姝ユ暟绱姞璧锋潵鐨勶紝鍗砈n=Sn-1+1+Sn-1锛屽寲绠寰桽n=2Sn-1+1銆傚甫鍏ユ暟鍊硷紝鍙緱涓鐧惧眰鐨勬眽璇哄闇瑕1267650600228229401496703205376姝ャ
绛旓細姹夎濉旂殑闂鍏跺疄闈炲父闈炲父绠鍗晘闂細閭d箞瀹冨埌搴曟湁澶氱畝鍗曞憿锛熺瓟锛姹夎濉旈棶棰=鈥滆鎶婂ぇ璞¤鍐扮鎬诲叡鍒嗗嚑姝モ濈殑闂 鍏堢粨鍚堜笅鍥锯啌鐪嬩竴涓嬫垜浠殑璁惧畾锛氣憼涓夋牴鏌卞瓙浠庡乏鑷冲彸渚濇涓篈 B C锛屼簲棰椾覆鐝犱粠灏忓埌澶т緷娆′负1~5銆傗憽鎶婃渶涓嬮潰涓棰椾覆鐝犵湅浣滃ぇ璞★紝涓婇潰鐨勫嚑棰椾覆鐝犵湅浣滃啺绠遍棬銆侾S:鍥句腑鏄渶甯歌鐨勪簲灞傛眽璇哄...
绛旓細浜岄樁姹夎濉旈棶棰鍏ㄩ儴鍙兘鐨勭姸鎬佹湁7绉嶃傛嫇灞曪細褰撴眽璇哄灞傛暟瓒呰繃2灞傛椂锛屽彲鑳界殑鐘舵佸氨浼氭湁澶氱锛屽叿浣撳彲鑳界殑鐘舵佹暟閲忓彲浠ョ敤姹夎濉斿畾寰嬫潵琛ㄧず锛2^n-1锛屽叾涓璶浠h〃灞傛暟銆
绛旓細1銆姹夎濉锛堝張绉娌冲唴濉锛闂鏄簮浜庡嵃搴︿竴涓彜鑰佷紶璇寸殑鐩婃櫤鐜╁叿銆傚ぇ姊靛ぉ鍒涢犱笘鐣岀殑鏃跺欏仛浜嗕笁鏍归噾鍒氱煶鏌卞瓙锛屽湪涓鏍规煴瀛愪笂浠庝笅寰涓婃寜鐓уぇ灏忛『搴忔憺鐫64鐗囬粍閲戝渾鐩樸傚ぇ姊靛ぉ鍛戒护濠嗙綏闂ㄦ妸鍦嗙洏浠庝笅闈㈠紑濮嬫寜澶у皬椤哄簭閲嶆柊鎽嗘斁鍦ㄥ彟涓鏍规煴瀛愪笂銆傚苟涓旇瀹氾紝鍦ㄥ皬鍦嗙洏涓婁笉鑳芥斁澶у渾鐩橈紝鍦ㄤ笁鏍规煴瀛愪箣闂翠竴娆″彧鑳界Щ鍔ㄤ竴涓渾鐩...
绛旓細1銆佷竷灞傜殑姹夎濉旀父鎴忔渶灏戦渶瑕127姝ャ傚叾瀹炵畻娉曢潪甯哥畝鍗曪紝褰撶洏瀛愮殑涓暟涓簄鏃讹紝绉诲姩鐨勬鏁板簲绛変簬2^n_1銆傚悗鏉ヤ竴浣嶇編鍥藉鑰呭彂鐜颁竴绉嶅嚭浜烘剰鏂欑殑绠鍗曟柟娉曪紝鍙杞祦杩涜涓ゆ鎿嶄綔灏卞彲浠ヤ簡銆2銆佸埄鐢ㄤ簩鍙夐掑綊鏍戞枃鐚甗4]鎸囧嚭锛姹夎濉旈棶棰鐨勯掑綊绠楁硶浠g爜涓庝簩鍙夋爲鐨勪腑搴忛亶鍘嗙畻娉曚唬鐮佸崄鍒嗙浉浼硷紝鏁呴噰鐢ㄤ簡浜屽弶鏍戠殑涓簭...