بررسي مسئله :برج هانوي

aira

Member
سلام من برنامه برج هانوي رو نوشتم ميخواستم بدونم درسته يا نه؟؟
کد:
 #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;
}
 

aira

Member
نيازمند ياري سبزتان هستم

ميتونيد يه ذره راهنماييم كنيد تا بتونم برنامشو بنويسم
با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=ميله سوم به عنوان ميله مقصد
 
کمی یاری قرمز ;)

سلام.

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

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

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

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

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

aira

Member
ولي تا اونجايي كه به ما گفتن اين مسئله سه حلقه يكسان داره .
الگوريتمي كه من نوشتم از يك حاقه به عنوان كمك استفاده كرده و ديسك ها رو بع صورت n-1جابجا ميكنه.
جوابشو بزود ميزارم
 
سلام

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

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

http://www.cs.brandeis.edu/~obaby/cs11a/functions/hanoi.gif
 
آخرین ویرایش:

aira

Member
بله.اصلاً خود مسئله به همين صورت هست.اينم جوابش: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

Member
دوست عزيز برنامه مشكل داره اصلا اجرا نمي شه ؟!!!
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا