এই নিবন্ধে অপর্যাপ্ত তথ্য রয়েছে অনেকেই নিবন্ধটির বিষয়বস্তু সম্পর্কে অপরিচিত। দয়া করে উইকিপিডিয়ার রচনাশৈলি অনুসারে, নিবন্ধটির উন্নয়নে অংশ নিন।(সেপ্টেম্বর ২০১৬)
টাওয়ার অব হানয় (এছাড়াও বলা হয় টাওয়ার অফ ব্রাহ্ম বা লুকাস টাওয়ার[১]) হল এক ধরনের বুদ্ধির খেলা । এ খেলায় তিনটি দন্ড খাড়াভাবে পাশাপাশি রাখা থাকে । এবং ছোট বড় কিছু ডিস্ক বা চাকতি দন্ড এর ভিতর প্রবেশ করান থাকে । এ খেলায় প্রথম দন্ড থেকে তৃতীয় দন্ডে সবগুলো চাকতি আনতে হয় । তবে কিছু নিয়ম পালন করতে হয় । নিয়মগুলো হলো:
১. একসাথে একাধিক চাকতি সরানো যাবে না।
২. কখনই ছোট চাকতির উপর বড় চাকতি রাখা যাবে না।
৩. সবসময় উপরের চাকতি ওঠানো যাবে।
হ্যানয় ধাঁধার টাওয়ার সমাধানের জন্য প্রয়োজনীয় ন্যূনতম সংখ্যা চাল হলো , যেখানে n হল ডিস্কের সংখ্যা।
সমাধান
টাওয়ার অব হানয় সমাধান করা আগে খুব কঠিন ছিল । এখন এটি সমাধান করার জন্য নানা ধরনের এলগরিদম বের হয়েছে । নিচে এর এলগরিদম গুলো নিয়ে আলোচনা করা হলোঃ
মনে কর ,১ নং দন্ড টি হলো ১ , ২ নং ২ এবং ৩ নং ৩
জোড় সংখ্যার ক্ষেত্রেঃ
১. ১ ও ২ এর মধ্যে একটি সঠিক মুভ কর
২. ১ ও ৩ এর মধ্যে একটি সঠিক মুভ কর
৩. ২ ও ৩ এর মধ্যে একটি সঠিক মুভ কর
৪. সম্পূর্ণ না হওয়া পর্যন্ত চালিয়ে যাও
বিজোড় সংখ্যার ক্ষেত্রেঃ
১. ১ ও ৩ এর মধ্যে একটি সঠিক মুভ কর
২. ১ ও ২ এর মধ্যে একটি সঠিক মুভ কর
৩. ২ ও ৩ এর মধ্যে একটি সঠিক মুভ কর
৪. সম্পূর্ণ না হওয়া পর্যন্ত চালিয়ে যাও
সুডোকোডে আলগরিদম
A=[5,4,3,2,1]B=[]C=[]defmove(n,source,target,auxiliary):<nowiki></nowiki>ifn>0:<nowiki></nowiki># move n-1 disks from source to auxiliary, so they are out of the way <nowiki></nowiki>move(n-1,source,auxiliary,target)<nowiki></nowiki># move the nth disk from source to target<nowiki></nowiki>target.append(source.pop())<nowiki></nowiki># Display our progress<nowiki></nowiki>print(A,B,C,'##############',sep='\n')<nowiki></nowiki><nowiki></nowiki># move the n-1 disks that we left on auxiliary onto target<nowiki></nowiki>move(n-1,auxiliary,target,source)<nowiki>#</nowiki> initiate call from source A to target C with auxiliary B move(5,A,C,B)
সি++ কোড
#include<iostream>usingnamespacestd;voidtower_hannoi(intdisk,chartower1,chartower2,chartower3){if(disk==1){cout<<"Move disk "<<disk<<" from "<<tower1<<" to "<<tower3<<endl;}else{tower_hannoi(disk-1,tower1,tower3,tower2);cout<<"Move disk "<<disk<<" from "<<tower1<<" to "<<tower3<<endl;tower_hannoi(disk-1,tower2,tower1,tower3);}}intmain(){intdisk;chartower1='A';chartower2='B';chartower3='C';cin>>disk;tower_hannoi(disk,tower1,tower2,tower3);return0;}