X
تبلیغات
رایتل

قرآن در کامپیوتر

دانلود نرم افزار های قرآنی یه صورت رایگان

سورس برنامه حرکت اسب به زبان ++C

 برنامه ای بنویسید که حرکت اسب را شبیه سازی کند ، به طوری که یک اسب از یک خانه از صفحه شطرنج شروع به حرکت کرده و تمام خانه ها را طی کند به شرط اینکه به هر خانه فقط یک بار برود.
محل شروع اسب را از کاربر می پرسد.
مثال : در شکل ادامه مطلب محل شروع حرکت خانه (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 کپی نمایید،
  فرورفتگی ها و برآمدگی های نامنظم آن ها به درستی نمایش داده می شوند. 

منبع : http://forum.sohail2d.com/viewtopic.php?t=7461

تاریخ ارسال: پنج‌شنبه 15 بهمن‌ماه سال 1388 ساعت 01:57 ب.ظ | نویسنده: مهندس | چاپ مطلب 5 نظر