برنامه ای بنویسید که حرکت اسب را شبیه سازی کند ، به طوری که یک اسب از یک خانه از صفحه شطرنج شروع به حرکت کرده و تمام خانه ها را طی کند به شرط اینکه به هر خانه فقط یک بار برود.
محل شروع اسب را از کاربر می پرسد.
مثال : در شکل ادامه مطلب محل شروع حرکت خانه (1،1) در نظر گرفته شده است . حرکت بعدی اسب خانه (2،3) است که با عدد 2 شماره گذاری شده است . و عدد 3 برای حرکت سوم می باشد
صفحه شطرنج 8*8 است پس باید اسب 64 حرکت داشته باشد.
//This program shoes horse jumpings in squars of a chessboard
//by printing order of them with numbers of places.
//programmer: mostafa mokhtari student of payam noor hamadan.
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
int min,npos,l,m,counter,
board[9][9]={{0},{0}} ,nexti[9]={0},
exits[11][2] ,nextj[9]={0}, //main
ktmov1[9]={0,-2,-1,1,2,2,1,-1,-2}, // variables
ktmov2[9]={0,1,2,2,1,-1,-2,-2,-1};
int i,j,t,p,q,r,temp; //temporary required elements
void move(int min)
{ //This function
i = nexti[min]; //move horse place
j = nextj[min]; //if needed
board[i][j] = m;
}
void prompt(){
cout<<'\n'<<setw(22)<<"The chessboard is: "<<'\n'<<'\n';
for(p=1 ; p<=8 ; p++) {
for(q=1 ; q<=8 ; q++)
cout<<setw(4)<< board[p][q] ;
cout<< endl;
} // end_first for
} //end_prompt
void main(){
clrscr();
cout<<'\n'<<"This program shoes horse jumpings in all chessboard squars";
cout<<'\n'<<"by ordering them with numbers in similar chessboard. ";
cout<<'\n'<<"_____________________________________________________________";
cout<<'\n'<<"Enter Number Of Row And Column You Want To Start From ? ";
cout<<'\n'<<" ( 0<row<9 and 0<column<9 ) >> ";
cin>>i>>j;
board[i][j] = 1;
for(m=2 ; m<=64 ; m++) //main loop
{
for(p=0 ; p<=10 ;p++) //giving
for(q=0 ; q<=1 ;q++) //zero to
exits[p][q]=0; //variables
for(p=0 ; p<=8 ;p++) //and arrays
nexti[r]=nextj[r]=0; //needed
l=1 ;npos=0;
for (r=1 ; r<=8 ; r++) //This loop
{ //find rows and columns of
p =i + ktmov1[r]; //places the horse
q =j + ktmov2[r]; //can go and save
if( p<=8 && p>0 //rows in 'nexti' array and
&& q<=8 && q>0 //column in 'nextj' array
&& board [p][q]==0)
{
nexti[l] = p;
nextj[l] = q;
++l;
++npos; //number of positions
} // end_if
} //end_for
if(npos == 0){ //This condition check
prompt(); //the next place .
return; }
if(npos == 1) { // This condition check
min = 1; // if there is only one
move(min); // place to go, move horse
continue; } // to it.
t=0;
for( l=1 ; l<=npos ; l++) // This loop find and
{ // save numbers of exits
counter=0; // from every next place
for( r=1 ; r<=8 ; r++)
{
p=nexti[l] + ktmov1[r];
q=nextj[l] + ktmov2[r];
if( p<=8 && p>0 // checking next
&& q<=8 && q>0 // move is in board
&& board [p][q]==0) // and is empty
++counter;} // or not
exits[t][0]=l;
exits[t][1]=counter;
t++;
} //end for l
t=0;
min=exits[t][0];
temp=exits[t][1];
t++;
while(exits[t][0]!=0){ // finding minimum exit
if(temp>exits[t][1]){ // in next place
temp=exits[t][1];
min=exits[t][0];} // end_if
++t;
} //end_while
move(min);
}
prompt(); //showing board
getch();
cin.get();
}
توضیحات کاملتری از کد :
//This program shoes horse jumpings in squars of a chessboard
//by printing order of them with numbers of places.
//programmer: mostafa mokhtari student of payam noor hamadan.
با قرار دادن // می توانید یک خط را به توضیحات تبدیل نمایید.
بنده در مورد برنامه و برنامه نویس توضیح داده ام.
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
به کمک include# سرفایل هایی را به برنامه اضافه می نماییم.
دقت شود که دستوراتی مثل cout یا cin که ما داخل کد استفاده می کنیم در این سر فایل ها
تعریف شده اند.
int min,npos,l,m,counter,
board[9][9]={{0},{0}} ,nexti[9]={0},
exits[11][2] ,nextj[9]={0}, //main
ktmov1[9]={0,-2,-1,1,2,2,1,-1,-2}, // variables
ktmov2[9]={0,1,2,2,1,-1,-2,-2,-1};
int i,j,t,p,q,r,temp; //temporary required elements
متغیرهای مورد نیاز و نیز آرایه های لازم برای برنامه را در این قسمت تعریف نموده ام.
تنها موردی که در این قسمت نیاز به توضیح دارد، آرایه های ktmov1 و ktmov2 اند :
اعداد متناظر در این آرایه ها، تمامی حالت های مختلف حرکتی یک اسب از خانه فعلی را
شبیه سازی می کند (از عضو اول که در هردو صفر است استفاده نمی کنیم)
مثلا: عضو دوم در ktmov1 منفی 2 (2-)است و در ktmov2 ، یک (1)می باشد. زوج (2,1-) روی هم
دوحرکت به عقب در سطر و یک حرکت به بالا در ستون خانه های شطرنج را مشخص می کنند
که بعدا با اضافه کردن این اعداد به شماره سطر و ستون خانه فعلی اسب، خانه بعدی به دست می آید.
void move(int min)
{ //This function
i = nexti[min]; //move horse place
j = nextj[min]; //if needed
board[i][j] = m;
}
این تابع شماره حرکت را در محل آرایه شطرنج قرار می دهد.
توسط این تابع شماره های 2 تا 64 (همون m) را که توسط برنامه بدست آمده اند،
به داخل آرایه 9 در 9 با نام [][] board می ریزیم.
این شماره ها ترتیب حرکت اسب در خانه های شطرنج را مشخص می نمایند.
دقت شود که این m که در بالا گفتم همون شمارنده در حلقه تکرار for است که توسط این حلقه
افزایش پیدا می کند.
void prompt(){
cout<<'\n'<<setw(22)<<"The chessboard is: "<<'\n'<<'\n';
for(p=1 ; p<=8 ; p++) {
for(q=1 ; q<=8 ; q++)
cout<<setw(4)<< board[p][q] ;
cout<< endl;
} // end_first for
} //end_prompt
توسط این تابع، خروجی و نتیجه کار را به کاربر نمایش می دهیم.
برای نمایش منظم یک مربع متشکل از هشت سطر و هشت ستون، نیاز داریم فاصله ها در اعداد
یک رقمی و دو رقمی تنظیم شود و برابر باشد.
تابع () setw این کار را با تعداد خانه هایی که برایش مشخص می نماییم برای ما انجام می دهد.
void main(){
clrscr();
cout<<'\n'<<"This program shoes horse jumpings in all chessboard squars";
cout<<'\n'<<"by ordering them with numbers in similar chessboard. ";
cout<<'\n'<<"_______________________________________";
تابع اصلی ما از این قسمت شروع به کار می کند.
در ابتدا توضیحاتی برای کاربر برنامه نمایش می دهیم.
cout<<'\n'<<"Enter Number Of Row And Column You Want To Start From ? ";
cout<<'\n'<<" ( 0<row<9 and 0<column<9 ) >> ";
cin>>i>>j;
شماره سطر و ستون مربوط به صفحه شطرنج برای شروع حرکت اسب از آن خانه
را می گیریم از کاربر و در متغیرهای i و j ذخیره می نماییم.
board[i][j] = 1;
طبیعی است که نقطه شروع حرکت در صفحه باید شماره یک بگیرد.
پس شماره 1 را در سطر و ستون مشخص شده توسط کاربر برای صفحه شطرنج ذخیره می نماییم.
for(m=2 ; m<=64 ; m++) //main loop
{
حلقه ای تعریف می کنیم تا برای هریک از 63 خانه باقیمانده شطرنج، اعمال مربوط به
یافتن شماره خانه بعدی و ثبت شماره آن خانه در آرایه خروجی را انجام دهد.
for(p=0 ; p<=10 ;p++) //giving
for(q=0 ; q<=1 ;q++) //zero to
exits[p][q]=0; //variables
for(p=0 ; p<=8 ;p++) //and arrays
nexti[r]=nextj[r]=0; //needed
در این قسمت در ابتدای شروع کارهای تکراری در داخل حلقه، میباید آرایه ها و
متغیرهای استفاده شده داخل حلقه را مقدار اولیه دهیم.
l=1 ;npos=0; for (r=1 ; r<=8 ; r++) //This loop
{ //find rows and columns of
p =i + ktmov1[r]; //places the horse
q =j + ktmov2[r]; //can go and save
if( p<=8 && p>0 //rows in 'nexti' array and
&& q<=8 && q>0 //column in 'nextj' array
&& board [p][q]==0)
{
nexti[l] = p;
nextj[l] = q;
++l;
++npos; //number of positions
} // end_if
} //end_for
در این حلقه با کمک گرفتن از آرایه کمکی ktmov (که مقدارهای مجاز برای
حرکت های مختلف اسب در آن ذخیره شده است) مکان های بعدی که اسب از خانه فعلی می تواند به آن
مکان ها برود را در نظر می گیریم. چک می کنیم که
1- داخل خانه های صفحه شطرنج باشند .
2- قبلاً اشغال نشده باشند ، یعنی اسب قبلا به آن خانه حرکت نکرده باشد.
پس موقع خروج از این حلقه، آرایه های nexti و nextj ، به ترتیب سطر و ستون های مکان هایی
از خانه های شطرنج را ذخیره کرده اند که شرایط بالا را دارند.
if(npos == 0){ //This condition check
prompt(); //the next place .
return; }
قبل از هر کاری باید چک کنیم آیا به آخرین خانه ای که اسب می تواند برود رسیده ایم یا نه.
یعنی آیا خانه ای در آرایه های nexti و nextj ذخیره شده یانه.
که اگر به آخر رسیده بودیم می باید خروجی را نمایش دهیم تا تعداد حرکات اسب و نحوه حرکت مشخص شود.
if(npos == 1) { // This condition check
min = 1; // if there is only one
move(min); // place to go, move horse
continue; } // to it.
اگر هم تنها یک خانه باقی مانده باشد که خالی است و مجاز، پس به آن خانه می رویم.
تابع move همان طور که در بالا گفتم، محل اسب را در آرایه ای ذخیره می نماید.
t=0;
for( l=1 ; l<=npos ; l++) // This loop find and
{ // save numbers of exits
counter=0; // from every next place
for( r=1 ; r<=8 ; r++)
{
p=nexti[l] + ktmov1[r];
q=nextj[l] + ktmov2[r];
if( p<=8 && p>0 // checking next
&& q<=8 && q>0 // move is in board
&& board [p][q]==0) // and is empty
++counter;} // or not
exits[t][0]=l;
exits[t][1]=counter;
t++;
} //end for l
در این حلقه تعداد خروجی های مجاز برای هرکدام از خانه های بعدی که اسب از محل
فعلی می تواند برود را به دست می آوریم .
t=0;
min=exits[t][0];
temp=exits[t][1];
t++;
while(exits[t][0]!=0){ // finding minimum exit
if(temp>exits[t][1]){ // in next place
temp=exits[t][1];
min=exits[t][0];} // end_if
++t;
} //end_while
این قسمت از برنامه با استفاده از آرایه exits، (که در ستون صفرم، شماره حرکت و
در ستون یکم تعداد خروجی را ذخیره کرده است) شماره حرکتی را پیدا می کند که با اعمال آن بر روی
محل فعلی اسب، کمترین خروجی از آن محل ممکن باشد.
یعنی محلی را انتخاب می کند که تعداد حرکات بعدی از آن محل، کمتر از بقیه باشد.
move(min);
}
حرکت به محل پیدا شده و بازگشت به ابتدای حلقه 63تایی برای یافتن خانه(های) بعدی.
(این تابع را در بالا تعریف کردم)
prompt(); //showing board
نمایش آرایه خروجی.
(این تابع را هم در بالا توضیح دادم)
getch();
cin.get();
}
در انتهای کار با توابع روبرو، صفحه نمایش نتیجه را نگه می داریم تا زود بسته نشود و برای کاربر
قابل دیدن باشد.
تذکر:
جملات انگلیسی که در خلال کد با علامت // آورده ام، جملات معنی داری اند که
در چند سطر نوشته شده اند و اگر شما کد را داخل ویرایشگر Borland C++ 5.02 کپی نمایید،
فرورفتگی ها و برآمدگی های نامنظم آن ها به درستی نمایش داده می شوند.
سلام
می خواستم بپرسم شما قبلا برنامه نویسی رو چطور یاد گرفتید؟جایی کلاس رفتید؟برای کسی که چیزخاصی از برنامه نویسی سر در نمیاره چه پیشنهادی دارین؟!
ممنون
خواندن کتاب به همراه تمرین بهترین پیشنهاد من است
با سلام. ۲تا سوال داشتم. اول اینکه چرا سطر و ستون از ۰ تا ۹ باید انتخاب بشه نه از ۱ تا ۸
دوم اینکه من اصلا متوجه نتایجی که نشون میده نیستم. مثلا وقتی من ۱و۱ رو وارد میکنم جوابش 1،16،27و... رو نشون میده. این اعداد کجا رو نشون میده؟
از پاسخگوییتون ممنونم
سلام
برای اینکه وقتی اسب از سطر و ستون خارج می شه دیگه کامپایلر خطا نده
بعد هم این عدد ها بترتیب مکان هایی است که اسب باید به آن خونه ها برود
سلام
می خواستم یه کمکی کنین
استادمون گفته یه برنامه واسه محافظ صفحه نمایش تو c++ بنویسین
می خواستم اگه ممکنه راهنماییم کنین
ممنون میشم
کمک خیلی بزرگی می کنین
سلام
برنامه تان باید با استفاده از گرافیک باشد یا فقط حالت تیکس کافیست
من فقط تو حد ترم دوم کامپیوتر بلدم هرکدوم ساده تر هست
ممنون میشم
سلام و خسته نباشید خدمت دوستان
لینک سورس برنامه ای که من نوشتم که دوستمون محبت کرده اند و در پایان مطلبشون قرار داده اند از بین رفته.
لینک مرجع اصلسی رو با اجازتون اصلاح می کنم.
این برنامه رو به عنوان پروژه یکی از درسامون نوشتم که امیدوارم برای دوستان مفید باشه.
از صاحب وبلاگ هم بابت امانتداری ممنونم