المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


آموزش:الگوریتم:برج هانوی

مسأله برج هانوی

تعریف

برج هانوی یک مسأله معروف الگوریتمی است، که پیشینه‌ی تاریخی بسیار طولانی دارد.
اولین بار این مسأله در یک معبد شکل گرفت. سه برج الماس در این معبد وجود داشت که در اولین برج، 64 حلقه از کوچک به بزرگ مرتب شده بودند. کاینان قصد داشتند تا این حلقه ها را از روی این برج، به برج دیگر منتقل کنند و معتقد بودند با انجام این کار، عمر دنیا به پایان خواهد رسید.
شرح مسأله بدین صورت است : سه میله داریم که در اولین میله n مهره قرار دارد. ‌می‌خواهیم این مهره‌ها را به سومین میله منتقل کنیم با این شرط که در هر مرحله و در هر میله، مهره‌های موجود در آن میله از بالا به پایین به ترتیب کوچک به بزرگ باشند.

حل بازگشتی مسأله

فرض کنید میله‌ها را با اعداد 1 تا 3 شماره‌گذاری کنیم. هدف بردن n دیسک از میله شماره 1 به میله شماره 3 است.
می‌توان مسأله را به این صورت شکست : ایتدا فرض می‌کنیم بزرگترین حلقه وجود ندارد. این فرض صحیح است، چرا که حلقه‌ای وجود ندارد که اندازه‌ی آن از این میله بزرگتر باشد. مسآله را تبدلی می کنیم به این مسآله که، می خواهیم n-1 حلقه را از میله شماره 1 به میله شماره 2 منتقل کنیم. سپس حلقه‌ی شماره n را به میله‌ی شماره 3 منتقل کنیم و سپس مسأله‌ی انتقال n-1 حلقه از میله‌ی شماره 2 به میله‌ی شماره 3 را حل کنیم.
پیاده سازی این الگوریتم به صورت زیر است :

void Hanoi (int start, int end, int count) {
    if(count == 1 ) {
        cout<<"Ring number 1 from "<<start<<" to "<<end<<endl;
        return;
    }
    Hanoi(start, 6-start-end, count-1);
    cout << "Ring number "<<count<<" from "<<start<<" to "<<end<<endl;
    Hanoi(6-start-end, end , count-1);
}

ابزار صفحه