ايران ويج

نسخه‌ی کامل: برجهاي هانوي
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
در مورد برجهاي هانوي و برنامه برجهاي هانوي كسي ميتونه كمكم كنه ( الگوريتم برجهاي هانوي )

ممنون ميشم
(۲۸-فروردین-۱۳۸۹, ۱۴:۳۳:۳۸)mhzza نوشته است: [ -> ]در مورد برجهاي هانوي و برنامه برجهاي هانوي كسي ميتونه كمكم كنه ( الگوريتم برجهاي هانوي )

ممنون ميشم
من یک برنامه به زبان پاسکال دارم(lord_viper)، شاید کمکت کند.
البته این الگوریتم به صورت باز گشتی کار می کند.
کد:
program hanoy;
var
n:integer;
procedure tower(fromp,top,help:char;n:integer) ;
begin
if n=1 then
writeln('move disk 1 form ',fromp,' to ',top)
else
begin
tower(fromp,help,top,n-1);
writeln('move disk ',n,' from ',fromp,' to ',top);
tower(help,top,fromp,n-1);
end
end;
Begin
write('Enter number of disks : ');
readln(n);
tower('A','B','C',n);
readln;
End.
سرچ زدن خیلی سخته؟

http://iranled.com/forum/showthread.php?tid=16740
سلام
اين قطعه كد هانوي بهينه هم هست
کد:
* hanoi.cpp solves the Towers of Hanoi puzzle recursively.
*
* Input:  numDisks, the number of disks to be moved
* Output: a sequence of moves that solve the puzzle */

#include <iostream.h>
#include <conio.h>


void Move(int n, char source, char destination, char spare);
int count = 0;

int main()
{
  const char PEG1 = 'A',            // the three pegs
             PEG2 = 'B',
             PEG3 = 'C';

  cout << "This program solves the Hanoi Towers puzzle.\n\n";

  cout << "Enter the number of disks: ";
  int numDisks;                     // the number of disks to be moved
  cin >> numDisks;
  cout << endl;

  Move(numDisks, PEG1, PEG2, PEG3); // the solution
// getch();
  return 0;

}

/* Move is a recursive function to solve the
* Towers of Hanoi puzzle.
*
*  Receive: n, the number of disks to be moved;
*           source, peg containing disk to move
*           destination, peg where to move disk
*           spare, peg to store disks temporarily,
*  Output:  A message describing the move
**************************************************/

void Move(int n,
          char source, char destination, char spare)
{
  if (n <= 1)                      // anchor
cout << "Move the top disk from " << source
         << " to " << destination << endl;
  else
  {                                // inductive case
    Move(n-1, source, spare, destination);
    Move(1, source, destination, spare);
    Move(n-1, spare, destination, source);
  }
خواهشا در مورد حل اين برجهاي هانوي توضيح بدهيد
ببخشيد مي تونيد اين مسئله رو براي من توضيح بديد چطوري حل ميشه
بسط تيلور براي cosx
با سلام.این الگوریتم میخواد به شما کمک کنه تا دیسکهایی رو که دارید رو در میله ی مقصد©با ترتیب بزرگ به کوچک از پایین به بالا قرار بدید.دیفالت ما اینه که این دیسکها به همون ترتیب در میله ی مبدأ(A)قرار دارند.حالا باید دیسکها رو طوری جابجا کنیم که مطلوب ظاهر بشه.البته با کمترین جابجایی.n تعداد دیسکهاست.تعداد جابجاییهای بهینه از رابطه ی 2 به توان این وریایبل منهای 1 بدست میاد.کافیه بجای این متغیر عدد 3 رو جایگزین کرده و الگوریتم رو استپ به استپ اجرا کنید.جابجاییها به شرح زیر خواهند بود.
کد php:
A to B
A to C
C to B
A to C
B to A
B to C
A to C 

کد php:
void Hanoi(n,A,B,C)
{
if(
n==1)
mov disk  #n from A to C
else
{
Hanoi(n-1,A,C,B)
mov disk  #n from A to C
Hanoi(n-1,B,A,C)
}

از همه معذرت می خوام که این پست قدیمی رو بالا آوردم ولی چون این مشکل خودم بوده و هیچ جا جوابشو پیدا نکردم,فکر کردم راه حلی که خودم پیدا کردم رو اینجا بنویسم تا آیندگان استفاده کنن!
تو همه ی کتاب ها و منابع(البته تا اونجایی که من دیدم!)فقط راه حل برج های هانوی گفته شده و مرتبه ی الگوریتمش تحلیل شده که این الگوریتم از مرتبه ی n2 هستش.
دلیل این که این راه حل این جوری هست رو توضیح می دم:
فرض کنید سه حلقه در برج a داریم و به کمک برج b می خوایم اون ها رو در برج c قرار بدیم.اگه از آخر به اول نگاه کنیم(روش معمول برای طراحی الگوریتم های بازگشتی)باید حلقه ی 3 در برج c باشه که حلقه های 1و2 رو روش قرار بدیم.برای این کار اول باید حلقه های 1و2 رو از برج a به برج b انتقال بدیم تا حرکت حلقه ی 3 امکان پذیر باشه.
پس الان صورت مساله شد این:
دو حلقه در برج a داریم که می خوایم با کمک برج c اون ها رو در برج b قرار بدیم.برای این کار اول باید حلقه ی 1 رو در برج c بزاریم و بعد حلقه ی 2 رو بزاریم تو برج b و در نهایت حلقه ی 1 رو بزاریم روی حلقه ی 2.وقتی این کار انجام شد حلقه ی 3 رو (که الان روش خالیه) از برج a به برج c(که الان هیچ حلقه ای توش نیست) انتقال می دیم. و بازهم صورت مساله به این شکل درمیاد:
دو حلقه در برج b داریم که می خوایم به کمک برج a اون ها رو در برج c قرار بدیم.انتقال دو حلقه رو قبلا توضیح دادم.با حل این مساله ی فرعی , مساله ی اصلی حل میشه.
اگه مساله رو برای 4 حلقه در نظر بگیریم باید اول حلقه های 1و2و3 رو در برج b بزاریم تا بتونیم حلقه ی 4 رو بزاریم سر جاش.وهمین طور الی آخر.
اگه یکم به توضیحات بالا دقت کنید متوجه میشید که اگه برج s مبدا باشه , برج d مقصد باشه و برج t کمکی باشه, اگه بخوایم تعدادی فرد حلقه رو جا به جا کنیم باید اولین حلقه رو از s به d جابه جا کنیم.و اگه تعداد حلقه هایی که باید جابه جا شن زوج باشه باید اولین حلقه رو از s به t جابه جا کنیم.
توی مثال بالا وقتی می خواستیم سه تا حلقه رو از a به c جابه جا کنیم اولین حلقه رو گذاشتیم توی c و وقتی خواستیم دوتا حلقه رو از b به c منتقل کنیم , اولین حلقه رو گذاشتیم توی a.
دلیل این کدهای بازگشتی که میبینید چیزی جز این نیست.
موفق باشید!
سلا.
برنامه هانوی باvb هست میگذارم شایدکمکت کنه.
hanoi