View previous topic :: View next topic |
Author |
Message |
Amir مدير مباحث عمومي سايت
Joined: 30 Nov 2004 Posts: 1088 Location: Age Hammam Nabasham To Lebasamam
|
Posted: Sat Jul 09, 2005 1:06 pm Post subject: مسالهی گردش اسب |
|
|
فقط بايد زود آماده بشه. واسه دوشنبه صبح ميخواد طرف. قيمت بدين
(گردش اسب) یکی از معماهای جالب شطرنج بازان، مساله ی گردش اسب است که توسط یاضیدان مشهور ،اولر مطرح شد.سوال این است : آیا مهره ی اسب در شطرنج می تواند در یک صفحه ی خالی شطرنج به گونه ای گردش کند که با هریک از 64 خانه یک بار و فقط یک بار تماس پیدا کند؟ این مسئله ی جالب را در اینجا به تفصیل مورد مطالعه قرار می دهیم.
اسب می تواند حرکاتی به شکل انجام دهد(دو خانه در یک جهت و سپس یک خانه در جهت عمود بر جدول اول) . به این ترتیب یک اسب از خانه ای در وسط صفحه ی خالی شطرنج می تواند هر یک از هشت حرکت مختلفی را که در شکل 4-25 با اعداد 0 تا 7 نشان داده شده اند انجام دهد.
الف)یک صفحه ی شطرنج 8 در 8 روی صفحه ی کاغذی رسم کنید و سعی کنید مساله ی گردش اسب را با دست حل کنید.در اولین خانه که قرار می گیرد عدد 1 ، در دومین خانه عدد 2 ، در سومین خانه عدد 3 و... را بنویسید.پیش از آغاز گردش ، مسافتی را که می توانید طی کنید تخمین بزنید. پس از انجام کاربا دست چقدر به این تخمین نزدیک بودید؟
ب)برنامه ای را بنویسید که اسبی را در یک صفحه شطرنج گردش دهد. این صفحه را با یک آرایه ی دو اندیسی به نام* نمایش دهید.در ابتدا همه ی خانه ها را برابر با صفر قرار دهید.هر یک ازهشت حرکت ممکن بر حسب هر دو جزء افقی و عمودی آنها توصیف می شود.مثلاً حرکتی از نوع 0 به صورتی که در شکل 4-25 نشان داده شده شامل یک حرکت افقی به سمت راستبه اندازه ی دو خانه و یک حرکت عمودی به سمت بالا به اندازه ی یک خانه است.حرکت نوع 2 شامل یک حرکت افقی به سمت چپ به اندازه ی یک خانه و یک حرکت عمودی به سمت بالا به اندازه ی دو خانه است.حرکات هفقی به سمت چپ و حرکات عمودی به سمت بالا را با اعداد منفی نشان می دهیم.این هشت حرکت را می توان با دو آرایه ی تک اندیسی * و * به صورت زیر توصیف نمود:
برای نمایش ردیف و ستون محل جاری اسب از متغیرهای * و * استفاده کنید.برای انجام حرکتی از نوع * که * عددی بین 0 تا 7 است- برنامه از دو دستور زیر استفاده می کند :
Currentrow +=vertical[movenumber];
Currentcolumn +=horizontal[movenumber];
شمارنده ای را در نظر بگیرید که از 1 تا 64 تغیر می کند و در آن تعداد حرکاتی را که اسب تا به حال انجام داده است ثبت کنید.به خاطر داشته باشید که هر حرکت را از ÷یش بررسی کنید و ببینید که آیا اسب قبلا به آن خانه رفته است یا خیرو البته هر حرکت را بررسی کنید تا اسب از صفحه سطرنج خارج نشود.حال برنامه ای بنویسید که اسب را در صفحه شطرنج گردش دهد.برنامه را اجرا کنید.اسب مزبور چند حرکت انجام داد؟
ج) پس از نوشتن و اجرا کردن برنامه ی گردش اسب احتمالا دید خوبی نسبت به مساله پیدا کرده اید. ما از این دید استفاده می کنیم و یک روش ذهنی ( یا راهبرد) برای حرکت اسب معرفی می کنیم. روشهای ذهنی موفقیت را تضمین نمی کنند اما یک روش ذهنی حساب شده احتمال موفقیت را به شدت افزایش می دهد.احتمالا در یافته اید که خانه های اطراف صفحه، از خانه های نزدیکبه مرکز مشکل سازترند.
در واقع مشکل سازترین(یا دور از دسترس ترین) خانه ها، چهار خانه در گوشه های صفحه اند.
به طور ذهنی می توان گفتکه ابتدا باید به مشکل سازترین خانه ها رفتو آن خانه هایی را که دسترسی به آنها آسان تر است فعلا بازگذاریم ات هنگامی که در انتهای گردش ، جای خالی کمی در صفحه وجود داشت احتمال موفقیت بیشتری داشته باشیم.
می توان با دسته بندی خانه ها بر حسب میزان قابلیت دسترسی به آنها ، یک (( روش ذهنی مبتنی بر قابلیت دسترسی)) ابداع کرد.به این ترتیب که همواره اسب را به خانه ای با بیشترین دسترسی حرکت دهیم ( البته در بین حرکتها مجاز * شکل ). یک آرایه دو اندیسی به نام * را با اعدادی پر می کنیم که نشان دهنده ی تعداد خانه هایی باشد که از آن می توان به یک خانه ی مشخص دست یافت. در یک صفحه ی خالی هر یک از خانه های مرکزی امتیاز 8 ، هر یک از گوشه ها 2 امتیاز و بقثه خانه ها امتیازهای 3 ، 4 یا 6 را به ترتیب زیر خواهند گرفت:
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
اینک با استفاده از روش ذهنی قابلیت دسترسی برود. برنامه ای برای گردش اسب بنویسید. در هر لحظه اسب باید به خانه ای با کمترین قابلیت دسترسی برود.در حالت تستوی امتیاز دو یا چند خانه ، اسب می تواند به هر کدام از این خانه ها برود. بنابرین گردش را می توان از هر یک از چهار گوشه آغاز کرد.(توجه : برنامه باید هنگام گردش در صفحه ی شطرنج و اشغال خانه ها، از امتیاز قابلیت دستری بعضی از خانه ها کم کند.بدین ترتیب در هر لحظه امتیاز هر یک از خانه های باقی مانده دقیقا برابر با تعداد خانه هایی است که در حال حاضر می توانند به این خانه دست یابند.) این نخسه از برنامه را اجرا کنید.آیا یک گردش کامل انجام شد؟ حال این برنامه را به گونه ای تغییر دهید که 64 گردش را انجام دهد به طوری که هر گردش ، از یکی از خانه های صفحه شطرنج آغاز شود.در این اجرا چند گردش کامل انجام شد؟
د) نسخه ی دیگری از برنامه ی گردش اسب را بنویسید که هنگام برخورد با دو یا چند خانه با امتیازهای مساوی ، با نگاه به خانه های قابل دسترسی توسط این خانه های هم امتیاز ، تصمیم بگیرد که کدام یک را انتخاب کند. برنامه باید به خانه ای برود که در آن ، حرکت بعدی به خانه ای با کمترین امتیاز دسترسی صورت پذیرد. |
|
Back to top |
|
|
arash مدير بخش سي
Joined: 27 Nov 2004 Posts: 1232 Location: www.parsx.com
|
Posted: Sat Jul 09, 2005 7:18 pm Post subject: |
|
|
با عرض سلام خدمت امیر جان
1) امیر جان می شه دقیقا مشخص کنید کدوم سوال رو باید جواب بدند
2) امیر جان نمی خوام فضولی کنم ولی بنظر نمی یاد این سوال به تریپ کاردانی بخوره بیشتر به قسمت هوش مصنوعی کارشناسی ارشد می خوره ( البته شاید هم اشتباه می کنم )
3) نمی شه تا آخر هفته وقتش رو بیشتر کنی
4) در مورد قیمت باید اول سوال رو واضح بودنیم ( گرچه در اون صودت هم باز ... ) |
|
Back to top |
|
|
Amir مدير مباحث عمومي سايت
Joined: 30 Nov 2004 Posts: 1088 Location: Age Hammam Nabasham To Lebasamam
|
Posted: Sun Jul 10, 2005 12:09 am Post subject: |
|
|
اين رفيقمون انگار جواب رو از يكي گرفته. حالا ميخواهد يك تغييراتي بده كه كپي برابر اصل نباشه و استاد گرام تشخيص نده!
قيمت!؟ |
|
Back to top |
|
|
forouzan مهمون يكي دو روزه
Joined: 10 Jul 2005 Posts: 6
|
Posted: Sun Jul 10, 2005 9:48 am Post subject: |
|
|
سلام
بابا چرا هیچ کس جواب این سوال رو نمیده؟
تو رو خدا حلش کنین. |
|
Back to top |
|
|
unknown مدير بخش ويژوال بيسيك
Joined: 05 Dec 2004 Posts: 439 Location: Tehran
|
Posted: Sun Jul 10, 2005 12:39 pm Post subject: |
|
|
من که اصلا حوصلم نیومد بخونمش... |
|
Back to top |
|
|
forouzan مهمون يكي دو روزه
Joined: 10 Jul 2005 Posts: 6
|
Posted: Sun Jul 10, 2005 1:06 pm Post subject: |
|
|
این جواب سوال هستش ولی من اینو نمیخوام.هر کی میتونه یکم توش تغیرات بده
اگه سوالی داشتین آف !! بذارین forouzan_666 !YAhoo
|
//---------------------------------last edit by yazdan attarian by 84/4/18
#include<iostream.h>
#include<conio.h>
#include<stdlib.h> //random function
//---------------------------------golbal variable
int x1=3,y1=3,print=0;
int chess[8][8];
void movehorse(int key2);
void prnresult();
void automove();
//---------------------------------board function
void board()
{
int i;
gotoxy(0,0);
cout<<"\n";
for (i=1;i<=8;++i)
{
gotoxy(i*8,2);
cout<<char(64+i);
}
cout<<"\n\n";
for (i=1;i<=8;i++)
if (i % 2!=0)
{
cout<<" ++++++++ ++++++++ ++++++++ ++++++++ "<<"\n";
cout<<" ++++++++ ++++++++ ++++++++ ++++++++ "<<"\n";
cout<<i;
if (print==0)
cout<<" ++++++++ ++++++++ ++++++++ ++++++++ "<<"\n";
else
cout<<" "<<"\n";
cout<<" ++++++++ ++++++++ ++++++++ ++++++++ "<<"\n";
cout<<" ++++++++ ++++++++ ++++++++ ++++++++ "<<"\n";
}
else
{
cout<<" ++++++++ ++++++++ ++++++++ "<<"\n";
cout<<" ++++++++ ++++++++ ++++++++ "<<"\n";
cout<<i;
if (print==0)
cout<<" ++++++++ ++++++++ ++++++++ "<<"\n";
else
cout<<" "<<"\n";
cout<<" ++++++++ ++++++++ ++++++++ "<<"\n";
cout<<" ++++++++ ++++++++ ++++++++ "<<"\n";
}
cout<<"\n"<<" please enter nimber bettween 1..8 for move horse,c=result,a=ayto move ";
}
//--------------------------------------erase function
void erase(int x,int y)
{
int x2,y2;
x2=(x * 8)+ 4;
y2=(y * 5)+ 6;
gotoxy(x2,y2); //------------------x,y
textcolor(1);
x=++x;
y=++y;
x2= x % 2;
y2= y % 2;
if (((x2!=0) && (y2==0)) || ((x2==0) && (y2!=0)))
cout<<" ";
else
cout<<"++++++++";
}
//--------------------------------------draw function
void draw(int x,int y)
{
x=(x * 8)+ 4;
y=(y * 5)+ 6;
gotoxy(x,y);//-------------------------x,y
textcolor(3);
cout<<" Horse ";
}
//-------------------------------------move_hors function
void movehorse(int key2)
{
switch(key2)
{
case 49://-----------------------------1= up left
if ((y1-2>=0) &&(x1-1>=0)){
erase (x1,y1);
y1=y1-2;
x1=x1-1;
draw(x1,y1);
chess[x1][y1]=chess[x1][y1]+1;
}
break;
case 50://-----------------------------2= up right
if ((y1-2>=0) &&(x1+1<=7)){
erase (x1,y1);
y1=y1-2;
x1=x1+1;
draw (x1,y1);
chess[x1][y1]=chess[x1][y1]+1;
}
break;
case 51://-----------------------------3= down left
if ((y1+2<=7) &&(x1-1>=0)){
erase (x1,y1);
y1=y1+2;
x1=x1-1;
draw(x1,y1);
chess[x1][y1]=chess[x1][y1]+1;
}
break;
case 52://-----------------------------4= up right
if ((y1+2<=7) &&(x1+1<=7)){
erase (x1,y1);
y1=y1+2;
x1=x1+1;
draw(x1,y1);
chess[x1][y1]=chess[x1][y1]+1;
}
break;
case 53://-----------------------------5= left up
if ((y1-1>=0) &&(x1-2>=0)){
erase (x1,y1);
y1=y1-1;
x1=x1-2;
draw(x1,y1);
chess[x1][y1]=chess[x1][y1]+1;
}
break;
case 54://-----------------------------6= left down
if ((y1+1<=7) &&(x1-2>=0)){
erase (x1,y1);
y1=y1+1;
x1=x1-2;
draw(x1,y1);
chess[x1][y1]=chess[x1][y1]+1;
}
break;
case 55://-----------------------------7= right up
if ((y1-1>=0) &&(x1+2<=7)){
erase (x1,y1);
y1=y1-1;
x1=x1+2;
draw(x1,y1);
chess[x1][y1]=chess[x1][y1]+1;
}
break;
case 56://-----------------------------8= right down
if ((y1+1<=7) &&(x1+2<=7)){
erase (x1,y1);
y1=y1+1;
x1=x1+2;
draw(x1,y1);
chess[x1][y1]=chess[x1][y1]+1;
}
break;
//--------------------------------------C character = for calculate
case 99:
prnresult();
break;
//--------------------------------------A character= for random(automotic)
case 97:
automove();
break;
break;
}
}
//-------------------------------------print_result function
void prnresult()
{
int x,y,place,move,xp,yp;
place=0;
move=0;
for (x=0;x<8;++x)
for (y=0;y<8;++y)
if (chess[x][y]!=0)
{
place=place+1;
move=move+chess[x][y];
}
gotoxy(67,2);
cout<<" ";
gotoxy(67,2);
cout<<"move = "<<move;
gotoxy(67,3);
cout<<" ";
gotoxy(67,3);
cout<<"place = "<<place;
if(move>=1)
{
print=1;
board();
for (y=0;y<8;++y)
for (x=0;x<8;++x)
if(chess[x][y]!=0)
{
xp=(x * 8)+7;
yp=(y * 5)+6;
gotoxy(xp,yp);//----------------------------x,y
cout<<chess[x][y];
}
}
}
//-----------------------------------------auto move function
void automove()
{
int x,y,key,place1,move1,go_out=0;
do{
do{
key=random(8);
}while((key>8) && (key<1));
movehorse(key+48);
place1=0;
move1=0;
for (y=0;y<8;++y)
for (x=0;x<8;++x)
if (chess[x][y]!=0)
{
move1=move1+chess[x][y];
place1=++place1;
}
else
break;
if((place1==64)||(move1>=1000))
{
prnresult();
getch();
getch();
print=0;
board();
draw(x1,y1);
go_out=1;
for (x=0;x<8;++x)
for (y=0;y<8;++y)
chess[x][y]=0;
}
else
{
gotoxy(67,3);
cout<<" ";
gotoxy(67,3);
cout<<" place = "<<place1;
}
}
while(go_out==0);
}
//------------------------------------main part
void main()
{
int xx,yy,key1;
for (xx=0;xx<8;++xx)
for (yy=0;yy<8;++yy)
chess[xx][yy]=0;
clrscr();
board();
draw(x1,y1);
//-------------------------------------report
do{
key1=getch();
gotoxy(75,1);//----------------------x,y
cout<<key1<<" ";
if (print==1)
{
print=0;
board();
draw(x1,y1);
}
movehorse(key1);
}while(key1!=27);
}
|
|
|
Back to top |
|
|
arash مدير بخش سي
Joined: 27 Nov 2004 Posts: 1232 Location: www.parsx.com
|
Posted: Sun Jul 10, 2005 2:33 pm Post subject: |
|
|
منظورت اینکه به زبان C می خواهی نه C++ درسته ؟؟؟ |
|
Back to top |
|
|
arash مدير بخش سي
Joined: 27 Nov 2004 Posts: 1232 Location: www.parsx.com
|
Posted: Sun Jul 10, 2005 3:06 pm Post subject: |
|
|
این چیزی که این نوشته هیچ ربطی به سوال نداره بابا
امیر هنوزم می گم می شه ولی بیشتر از یک هفته نه کمتر( حداقل برای من ) |
|
Back to top |
|
|
forouzan مهمون يكي دو روزه
Joined: 10 Jul 2005 Posts: 6
|
Posted: Sun Jul 10, 2005 5:04 pm Post subject: |
|
|
سلام
برنامه رو باید با C++ بنویسید.در ضمن جوابش همینه که بالا دادم ولی باید تغیرات توش بدین.
باشه قبول تا هفته ی دیگه دوشنبه خوبه ، آهان راستی قیمتم بگین زودتر.مرسی. |
|
Back to top |
|
|
Dr.marmolak مهمون يكي دو روزه
Joined: 12 Jul 2005 Posts: 3
|
Posted: Tue Jul 12, 2005 12:26 pm Post subject: |
|
|
من با 20000 تومان حاظرم |
|
Back to top |
|
|
forouzan مهمون يكي دو روزه
Joined: 10 Jul 2005 Posts: 6
|
Posted: Tue Jul 12, 2005 3:19 pm Post subject: |
|
|
دکتر جون، من برنامه رو بالا دادم ، فقط میخوام یه تغیرات کوچولو روش بدین.همین.مرسی |
|
Back to top |
|
|
Dr.marmolak مهمون يكي دو روزه
Joined: 12 Jul 2005 Posts: 3
|
Posted: Tue Jul 12, 2005 8:11 pm Post subject: |
|
|
من برنامه ای بهتر از این می نویسم. و البته کاملتر.
نصفشم رو هم پیش می گیرم.
اگه می خاین شروع کنم.قابله شمارم نداره. |
|
Back to top |
|
|
Amir مدير مباحث عمومي سايت
Joined: 30 Nov 2004 Posts: 1088 Location: Age Hammam Nabasham To Lebasamam
|
Posted: Wed Jul 13, 2005 1:50 pm Post subject: |
|
|
20 تومن بالاست!
آرش كمتر از اينها راه ميياد ... |
|
Back to top |
|
|
forouzan مهمون يكي دو روزه
Joined: 10 Jul 2005 Posts: 6
|
Posted: Tue Jul 19, 2005 4:56 pm Post subject: |
|
|
Dr.marmolak wrote: | من برنامه ای بهتر از این می نویسم. و البته کاملتر.
نصفشم رو هم پیش می گیرم.
اگه می خاین شروع کنم.قابله شمارم نداره. |
سلام دکتر
باشه قبول، شروع کن برنامه رو بنویس .من برنامه رو تا شنبه صبح میخوام.باشه؟در مورد قیمت و نحوه ی پرداخت هم ایمیل بزن که صحبت کنیم.
forouzan_666@yahoo.com |
|
Back to top |
|
|
Dr.marmolak مهمون يكي دو روزه
Joined: 12 Jul 2005 Posts: 3
|
Posted: Wed Jul 20, 2005 10:36 pm Post subject: |
|
|
با سلام
چون خیلی دیر جواب دادی قیمت می ره رو 30 تومن چون من یه جمعه بیشتر وقت ندارم .
در مورد بقیه موارد هم باید بگم طبق قوانین سایت عمل می شود . نصف قیمت رو برا آقا وحید ارسال کن . در صورتی که شنبه هفته بعد بخوای می آید رو 20 تومن .
بستگی به خودت داره . لطفا آقا وحید در صورت دریافت پول اطلاع بدهید.
زودتر جواب بده تا دیرتر از این نشه . |
|
Back to top |
|
|
|