بررسي مسئله :برج هانوي [بایگانی] - MajidOnline Forums
جشنواره نوروزی فروشگاه اینترنتی مجید آنلاین


PDA

بازدید نسخه کامل شده : بررسي مسئله :برج هانوي


aira
23 آبان 1384, 19:57
سلام من برنامه برج هانوي رو نوشتم ميخواستم بدونم درسته يا نه؟؟
#include <stdio.h>
maim()
{
void transfer(int,char,char,char);
int n;
printf("how many disks?");
scanf("%d",&n); /*disks*/
printf("\n");
transfer(n,`L`,`R`,`C`); /*L=Left,R=Right,C=Center*/
}
void transfer(int n,char from,fromchar to,char temp)
{
if (n>0) {
transfer(n-1,from,temp,to);
printf("move disk %d from %c to %c\n",n,from,to);
transfer(n-1,temp,to,from);
}
return 0;
}

stranger_in_rain
24 آبان 1384, 22:14
به نظرم کد شما تنها یکی از حلقه ها را جابه جا میکند!

aira
24 آبان 1384, 23:28
ميتونيد يه ذره راهنماييم كنيد تا بتونم برنامشو بنويسم
باc++هم اينجوري نوشتم اين چطوره؛اگه ميتونيد راهنماييم كنيد تا برنامشو بنويسم::wink:
void Hanoi(int x,int h, int d)
{
if(x==1)
cout<<"move disk from"<<s<<"to"<<d;
else{
Hanoi(x-1,s,d,h);
cout<<"move disk from"<<s<<"to"<<d;
Hanoi(x-1,h,s,d);
‌‌
}


توضيح:
s:ميله اول
h=ميله دوم به عنوان ميله كمكي
d=ميله سوم به عنوان ميله مقصد

stranger_in_rain
01 آذر 1384, 10:05
سلام.

ببخشید یه ذره دیر میشه پاسخ های من. 2 مسئله در این جریان دخیل هستش ، سرم خیلی شلوغه !!!! و می ایستم ببینم کسی جواب میده یا نه ... :(

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

H(n)=(2^n)-1


ولی خوب مسئله به این سادگی هم نیست چون این طور که شما نوشتید برنامه رو، همه ی حلقه ها یکسان فرض شده، در حالی که حلقه ها size های گوناگون دارند. پس به این سادگی هم نیست ;)

من هنوز رو این مسئله فکر نکردم اما با این نکته هر دو فکر کنیم و حلش کنیم.

aira
02 آذر 1384, 07:40
ولي تا اونجايي كه به ما گفتن اين مسئله سه حلقه يكسان داره .
الگوريتمي كه من نوشتم از يك حاقه به عنوان كمك استفاده كرده و ديسك ها رو بع صورت n-1جابجا ميكنه.
جوابشو بزود ميزارم

stranger_in_rain
02 آذر 1384, 10:47
سلام

در مسئله ی کلی هانوی حلقه ها از بزرگ به کوچک روی هم چیده میشوند.
به طوری که بزرگترین زیر همه و کوچکترین روی همه قرار دارد ... و هیچ حلقه ی بزرگتری نمیتواند روی حلقه ی کوچک تر از خود قرار بگیرد ...

به این عکس نگاه کنید :

http://www.cs.brandeis.edu/~obaby/cs11a/functions/hanoi.gif

aira
02 آذر 1384, 12:38
بله.اصلاً خود مسئله به همين صورت هست.اينم جوابش:D

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

typedef char* Peg;
void move(Peg A, Peg B);
void transfer(size_t N, Peg A, Peg B, Peg C);
void get_disk_num(int &iNum);


int main()
{
while(1)
{
std::cout << "\t\t\tHanoi Towers Puzzle Solver" << std::endl << std::endl;
std::cout << "Enter number of disc on the first peg (enter -1 to quit): ";
int iDiskNum, iStepNum;
get_disk_num(iDiskNum);
if(iDiskNum == -1)
{
std::cout << "hope you enjoyed using these program!" << std::endl;
break;
}
else
{
iStepNum = pow(2, iDiskNum) - 1;
std::cout << "the shortest solution can be reach in " << iStepNum << " steps" << std::endl;
std::cout << "press any key to show the solution...";
getch();
std::cout << std::endl;
transfer(iDiskNum, "Peg1", "Peg2", "Peg3");
system("pause");
system("cls");
}
}
return 0;
}

// tedade jabejayi diskha
void move(Peg A, Peg B)
{
std::cout << "move top most disc from " << A << " to " << B << std::endl;
}

// chegonegiye harekate diskhara namayesh midahad
void transfer(size_t N, Peg A, Peg B, Peg C)
{
if(N > 0)
{
// enteghale avalin N - 1 disk be "B"
transfer(N - 1, A, C, B);

// enteghale akharin disk be "C"
move(A, C);

// enteghale dickhaye "B" be"C",
transfer(N - 1, B, A, C);
}
}

void get_disk_num(int &iNum)
{
std::cin >> iNum;
if(iNum != -1 && iNum < 1)
{
std::cout << "please notice that the number of disc needs to be an integer bigger than 0" << std::endl;
std::cout << "number of disc on the first peg: ";
get_disk_num(iNum);
}
}


بروبچ بياين كپي كنيد حالشو ببريد.يه دعايي هم براي بنده بخونيد

J4vad
03 آذر 1385, 15:14
دوست عزيز برنامه مشكل داره اصلا اجرا نمي شه ؟!!!

maryam1385
22 مهر 1386, 11:16
برج هانوي