یک مسابقه یک جایزه

shr6557

Member
سلام
من یه مسابقه که همچین سخت هست رو می گم یه جایزه هم براش گذاشتم اونم یه مجموعه سی دی king 2006 حاوی 12 سی دی (معادل 12000 تومان)
سوال از این قرار هست یک اسب چگونه می تونه از یک خانه شطرنج حرکتش رو شروع کنه و بدون اینکه خانه تکراری ای رو بره تمام خانه ها ی شطرنج رو طی کنه یعنی با 63 حرکت 64 خانه شطرنج رو طی کنه
اینکه از چه خانه ای شروع بشه فرقی نداره
من این برنامه رو نوشتم با تابع بازگشتی ولی این برنامه ای که من نوشتم خیلی کنده یعنی شاید چند روز هم کار
کنه تموم نشه شما باید برنامه این بنویسید که از الگوریتم دیگه ای استفاده کنه و بتونه تمام حالات رو حساب کنه
لطفا درمورد این که برنامه من چطوری کار می کنه نپرسید چون توضیح توی این کادر های تایپی سخت هست
#include<iostream.h>
#include<math.h>
#include<conio.h>

int table[8*8],nm=0;
void l2l(int number);
int main()
{
for (int i = 0 ; i <= 8*8-1 ; i++) table=0;
l2l(14);
return 0;
}

void l2l(int number)
{
table[number]=1;
nm++;
if (nm>8*8) cout << "Find One" << endl;
if(table[number + (8-2)] == 0 && (number + (8-2)) < 8*8 && (number + (8-2)) >= 0) l2l(number + (8-2));
if(table[number + (8+2)] == 0 && (number + (8+2)) < 8*8 && (number + (8+2)) >= 0) l2l(number + (8+2));
if(table[number + (2*8-1)] == 0 && (number + (2*8-1)) < 8*8 && (number + (2*8-1)) >= 0) l2l(number + (2*8-1));
if(table[number + (2*8+1)] == 0 && (number + (2*8+1)) < 8*8 && (number + (2*8+1)) >= 0) l2l(number + (2*8+1));
if(table[number - (8-2)] == 0 && (number - (8-2)) < 8*8 && (number - (8-2)) >= 0) l2l(number - (8-2));
if(table[number - (8+2)] == 0 && (number - (8+2)) < 8*8 && (number - (8+2)) >= 0) l2l(number - (8+2));
if(table[number - (2*8-1)] == 0 && (number - (2*8-1)) < 8*8 && (number - (2*8-1)) >= 0) l2l(number - (2*8-1));
if(table[number - (2*8+1)] == 0 && (number - (2*8+1)) < 8*8 && (number - (2*8+1)) >= 0) l2l(number - (2*8+1));
table[number]=0;
nm--;
}
 

aira

Member
ديگه وقتي حرفي جايزه ميشه نميشه وقت رو تلف كرد
آقا من رفتم حلش كنم....خدا به دادم برسه.......:shock:
 

saalek110

Well-Known Member
من قبلا يك شطرنج باز كامل نوشته بودم كه كار هم مي كرد. ولي فعلا فكر نكنم حريف رقبا بشم.
حريف قدره!!
.
 

zfarhad2003

Member
واقعا این مسابقه فکر جالبیه.
حالا جدای از جایزه اش که فکر نکنم کسی بدش بیاد مسئله ای رو هم که گفتین ارزش فکر کردن رو داره.

در هرحال من هم سعی می کنم یه الگوریتمی براش پیدا کنم. البته با اجازه اساتید.
 

aira

Member
من برنامشو نوشتم ولي يكي دوتا ايراد داره.رفعش كردم ميزارم
به زودي:d
 

saalek110

Well-Known Member
ما كه رديم . ولي قوانين بازي را ميشه باز بگيد.
ميشه مهره از يك خانه چند بار عبور كنه؟
.
 

shr6557

Member
اگه بالا رو بخونی می بینی که نمی تونه یک خونه رو چند بار بره
 

shr6557

Member
منتظر جواب aira هستم
اگر وقت نمی کنی ایراداش رو رفع کنی ایده کلی تو بگو
 
آخرین ویرایش:

aira

Member
جواب

بالاخره حلش كردم.البته ببخشيد ديرشد.آخه امتحان داشتم.البته بايد اعتراف كنم به تنهايي حل نكردم و از استادم هم كمك گرفتم.(خيلي هم زياد!!:D )
من با تابع و كلاس حلش كردم.يعني به برنامه مختصات صفحه رو دادم و اينجوري مختصات حركت مهره رو برنامه دباگ ميكنه.
اسب در صفحه شطرنج به صورت Lحركت مي كنه يعني در تو خانه اي كه هست براي حركت 2خانه به جلو و 2خانه در جهت عمود بر حركت قبلي ميرود.صفحه شطرنج رو با يك آرايه دو انديسي(a) مشخص مي كنيم ومقدار اوليه 0 ميديم.يك شمارنده هم از 1تا 64 انتخاب مي كنيم.تا اينجاش راحته اونجايي سخت ميشه كه ميخواي چهارگوشه صفحه رو در نظر بگيري.براي اين كار هم دسته بندي كردن صفحه شطرنج هست.فكر كنم متوجه شديد...
جايزه فراموش نشه...
:cool: :oops:
کد:
#include<iostream.h>
#include<conio.h>
class chess
{
	int i;
	int j;
	int k;
	int l;
	int n;
	int m;
	int a[8][8];
	public:
		void g0();
		int g1();
		int g2();
		void g3(int);
		void g4();
}a;

void chess::g0()
{
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
			a[i][j]=0;
	cout<<"Enter position i:"<<"\t";
	cin>>k;
	cout<<endl<<"Enter position j:"<<"\t";
	cin>>l;
	a[k][l]=1;
	cout<<endl;
	cout<<"("<<k<<","<<l<<")"<<"   ";
}

int chess::g1()
{
	int v,s[8];
	for(i=0;i<8;i++)
		s[i]=8;
	n=k+1;
	m=l-2;
	if(n<8 & m>=0)
		if(a[n][m]==0)
		       s[0]=g2();
	n=k+2;
	m=l-1;
	if(n<8 & m>=0)
		if(a[n][m]==0)
			s[1]=g2();
	n=k+2;
	m=l+1;
	if(n<8 & m<8)
		if(a[n][m]==0)
			s[2]=g2();
	n=k+1;
	m=l+2;
	if(n<8 & m<8)
		if(a[n][m]==0)
			s[3]=g2();
	n=k-1;
	m=l+2;
	if(n>=0 & m<8)
		if(a[n][m]==0)
			s[4]=g2();
	n=k-2;
	m=l+1;
	if(n>=0 & m<8)
		if(a[n][m]==0)
			s[5]=g2();
	n=k-2;
	m=l-1;
	if(n>=0 & m>=0)
		if(a[n][m]==0)
			s[6]=g2();
	n=k-1;
	m=l-2;
	if(n>=0 & m>=0)
		if(a[n][m]==0)
			s[7]=g2();
	v=8;
	for(i=0;i<8;i++)
		if(v>s[i])
		{
			v=s[i];
			j=i;
		}
	return j;
}

int chess::g2()
{
	int x,y,z=0;
	x=n+1;
	y=m-2;
	if(x<8 & y>=0)
		if(a[x][y]==0)
		       z++;
	x=n+2;
	y=m-1;
	if(x<8 & y>=0)
		if(a[x][y]==0)
			z++;
	x=n+2;
	y=m+1;
	if(x<8 & y<8)
		if(a[x][y]==0)
			z++;
	x=n+1;
	y=m+2;
	if(x<8 & y<8)
		if(a[x][y]==0)
			z++;
	x=n-1;
	y=m+2;
	if(x>=0 & y<8)
		if(a[x][y]==0)
			z++;
	x=n-2;
	y=m+1;
	if(x>=0 & y<8)
		if(a[x][y]==0)
			z++;
	x=n-2;
	y=m-1;
	if(x>=0 & y>=0)
		if(a[x][y]==0)
			z++;
	x=n-1;
	y=m-2;
	if(x>=0 & y>=0)
		if(a[x][y]==0)
			z++;
	return z;
}

void chess::g3(int j)
{
	if(j==0)
	{
		k+=1;
		l-=2;
	}
	else if(j==1)
	{
		k+=2;
		l-=1;
	}
	else if(j==2)
	{
		k+=2;
		l+=1;
	}
	else if(j==3)
	{
		k+=1;
		l+=2;
	}
	else if(j==4)
	{
		k-=1;
		l+=2;
	}
	else if(j==5)
	{
		k-=2;
		l+=1;
	}
	else if(j==6)
	{
		k-=2;
		l-=1;
	}
	else if(j==7)
	{
		k-=1;
		l-=2;
	}
}

void chess::g4()
{
	a[k][l]=1;
	cout<<"("<<k<<","<<l<<")"<<"   ";
}

void main()
{
	clrscr();
	int o=0;
	a.g0();
	while(o++!=63)
	{
		a.g3(a.g1());
		a.g4();
	}
	getch();
}
 

FOAD_NIK

New Member
سورس من کاملا" متفاوت است.
درضمن از سی پلاس پلاس استفاده کرده ام.
 

MnavidM

Active Member
ورودتون رو به سایت تبریک میگم.

اما این تاپیک مربوط به یک سال پیش می باشد. و کارش تموم شده.

موفق باشید.
نوید.
 

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

بالا