سلام من یه مسابقه که همچین سخت هست رو می گم یه جایزه هم براش گذاشتم اونم یه مجموعه سی دی 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--; }
من قبلا يك شطرنج باز كامل نوشته بودم كه كار هم مي كرد. ولي فعلا فكر نكنم حريف رقبا بشم. حريف قدره!! .
واقعا این مسابقه فکر جالبیه. حالا جدای از جایزه اش که فکر نکنم کسی بدش بیاد مسئله ای رو هم که گفتین ارزش فکر کردن رو داره. در هرحال من هم سعی می کنم یه الگوریتمی براش پیدا کنم. البته با اجازه اساتید.
جواب بالاخره حلش كردم.البته ببخشيد ديرشد.آخه امتحان داشتم.البته بايد اعتراف كنم به تنهايي حل نكردم و از استادم هم كمك گرفتم.(خيلي هم زياد!! ) من با تابع و كلاس حلش كردم.يعني به برنامه مختصات صفحه رو دادم و اينجوري مختصات حركت مهره رو برنامه دباگ ميكنه. اسب در صفحه شطرنج به صورت Lحركت مي كنه يعني در تو خانه اي كه هست براي حركت 2خانه به جلو و 2خانه در جهت عمود بر حركت قبلي ميرود.صفحه شطرنج رو با يك آرايه دو انديسي(a) مشخص مي كنيم ومقدار اوليه 0 ميديم.يك شمارنده هم از 1تا 64 انتخاب مي كنيم.تا اينجاش راحته اونجايي سخت ميشه كه ميخواي چهارگوشه صفحه رو در نظر بگيري.براي اين كار هم دسته بندي كردن صفحه شطرنج هست.فكر كنم متوجه شديد... جايزه فراموش نشه... کد (Text): #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_n20000@hotmail.com مشاهده پیوست KNIGHT_TOUR.zip
ورودتون رو به سایت تبریک میگم. اما این تاپیک مربوط به یک سال پیش می باشد. و کارش تموم شده. موفق باشید. نوید.