PersianTools Forums

Go Back   PersianTools Forums > برنامه نویسی و طراحی وب، سیستمهای مدیریت سایت > برنامه نویسی > خانواده C++ , C

Reply
 
امکانات بيشتر
Old 04-10-2006, 12:28 AM   #76
Arash_j13
Registered User
 
Arash_j13's Avatar
 

Join Date: Feb 2005
Location: مشهد
Posts: 777
Send a message via MSN to Arash_j13 Send a message via Yahoo to Arash_j13
خب یه تمرین دیگه

یه صفحه n در n داریم
که بعضی از این خونه ها ورود ممنوع هست کوتاه ترین مسیر بین دو نقطه دلخواه A و B اگر فقط مجاز باشیم به سمت بالا و پاین و چپ راست حرکت کنیم و وارد خانه ها مموع نوشیم کدام است

برای راحتی n را 10 بگیرید و خانه های بلوکه شده و A B ه رو از کاربر در یافت کنید و مختصات خانه ها جواب به همراه طول مسیر رو چاپ کنید
Arash_j13 is offline   Reply With Quote
Old 04-12-2006, 03:01 PM   #77
Trusted Member
mohammad_110
کاربر فعال برنامه نویسی
 

Join Date: Jan 2006
Posts: 60
Quote:
نوشته ای از Arash_j13
خب یه تمرین دیگه

یه صفحه n در n داریم
که بعضی از این خونه ها ورود ممنوع هست کوتاه ترین مسیر بین دو نقطه دلخواه A و B اگر فقط مجاز باشیم به سمت بالا و پاین و چپ راست حرکت کنیم و وارد خانه ها مموع نوشیم کدام است

برای راحتی n را 10 بگیرید و خانه های بلوکه شده و A B ه رو از کاربر در یافت کنید و مختصات خانه ها جواب به همراه طول مسیر رو چاپ کنید
سلام

من یه برنامه نوشتم البته اشکال برنامه ای نداره ولی ... اول برنامه :
Code:
#include<stdio.h>
#include<conio.h>

int board[10][10]={0},Ax,Ay,Bx,By;
int minBoard[10][10]={0},lMin=101;

void getABForbidenPlaces();
void find(int,int,int);

void main(){
  int i,j;
  clrscr();
  getABForbidenPlaces();
  find(Ax,Ay,0);
  clrscr();
  for(i=0;i<10;i++){
    for(j=0;j<10;j++)
      printf("%3d",minBoard[i][j]);
    printf("\n");
  }
  getch();
}

void getABForbidenPlaces(){
  int x,y;
  do{
    printf("Enter A x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Ax=x;Ay=y;
  }while(x<=0 || x>=10 || y<=0 || y>=10);
  do{
    printf("Enter B x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Bx=x;By=y;
  }while(x<=0 || x>=10 || y<=0 || y>=10 || board[Bx][By]==1);

  printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
  scanf("%d%d",&x,&y);
  while (x>0 && x<=10 && y>0 && y<=10 && board[x][y]==0 ){
    board[x][y]=-1;
    printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
    scanf("%d%d",&x,&y);
  }
}

void find(int x,int y, int l){
  int i,j;
  if(x==Bx && y==By){
    if(l<lMin){
      for(i=0;i<10;i++)
	for(j=0;j<10;j++)
	  minBoard[i][j]=board[i][j];
    }
    return;
  }
  if(x<0 || x>=10 || y<0 || y>=10 || board[x][y]!=0) return;
  board[x][y]=l;
  find(x+1,y  ,l+1);
  find(x  ,y+1,l+1);
  find(x-1,y  ,l+1);
  find(x  ,y-1,l+1);
  board[x][y]=0;
}
ولی چون باید 100^4 حالت را چک کنه یعنی 200^2 یعنی 20^(10^2) یعنی تقریبا 20^(1000) یعنی 60^10 حالت که اگر بر فرض محال کامپیوتر بتونه 6^10 حالت در ثانیه رو چک کنه حدود 317 روز طول میکشه .

برای همین اگه راهنمایی داشته باشید که بشه الگوریتم سریعتری نوشت بفرمایید.
__________________

Last edited by mohammad_110; 04-15-2006 at 09:14 PM..
mohammad_110 is offline   Reply With Quote
Old 04-12-2006, 03:34 PM   #78
Trusted Member
mohammad_110
کاربر فعال برنامه نویسی
 

Join Date: Jan 2006
Posts: 60
خوب راستی منم یک سئوال بگم .

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

سئوال اینه که دو تا رشته داریم که در این دو رشته دو عبارت ریاضی داریم و برنامه باید تشخیص بده که این دو رشته از لحاظ عبارت ریاضی با هم معادل هستند مثل:
Code:
(a+b-c)*2
(a+a)+(b*2-(3*c)+c
که با هم معادل هستن و برنامه باید yes چاپ کنه .

قواعد کار:
1- دو تا رشته لازم نیست از کاربر گرفته بشند و می تونند بصورت متغییر داخل برنامه تعریف بشند.
2- طول رشته ها حداکثر 80 کاراکتر هست و کاراکتر space یا فضای خالی بین کاراکتر ها وجود ندارد.
3- متغییر های عبارت ریاضی یک حرفی هستند.
4- اعداد تک رقمی هستند.
5- پرانتز های چپ و راست مجاز هستند
6- عملگرهای +و - و * استفاده می شوند (توجه کنید که تقسیم نداریم)
7- هر کدام از رشته ها صرفنظر از معادل بودن یا نبودن با دیگری دارای خطای ریاضی نیستند .(مثلا از لحاظ مساوی بودن پرانتز های باز و بسته و... و احتیاجی به چک کردن ندارند.)

یک مثال دیگه :
Code:
(a+b)*(a+b)
-2*a*b+b*b+a*a+4*a*b
که باید بتونه تشخیص بده این دو عبارت با هم معادل هستند و yes چاپ کنه.
mohammad_110 is offline   Reply With Quote
Old 04-12-2006, 07:44 PM   #79
Arash_j13
Registered User
 
Arash_j13's Avatar
 

Join Date: Feb 2005
Location: مشهد
Posts: 777
Send a message via MSN to Arash_j13 Send a message via Yahoo to Arash_j13
Quote:
نوشته ای از mohammad_110
سلام

من یه برنامه نوشتم البته اشکال برنامه ای نداره ولی ... اول برنامه :
Code:
#include<stdio.h>
#include<conio.h>

int board[10][10]={0},Ax,Ay,Bx,By;
int minBoard[10][10]={0},lMin=101;

void getABForbidenPlaces();
void find(int,int,int);

void main(){
  int i,j;
  clrscr();
  getABForbidenPlaces();
  find(Ax,Ay,0);
  clrscr();
  for(i=0;i<10;i++){
    for(j=0;j<10;j++)
      printf("%3d",minBoard[i][j]);
    printf("\n");
  }
  getch();
}

void getABForbidenPlaces(){
  int x,y;
  do{
    printf("Enter A x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Ax=x;Ay=y;
  }while(x<=0 || x>=10 && y<=0 && y>=10);
  do{
    printf("Enter B x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Bx=x;By=y;
  }while(x<=0 || x>=10 && y<=0 && y>=10);

  printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
  scanf("%d%d",&x,&y);
  while (x>0 && y>0){
    board[x][y]=-1;
    printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
    scanf("%d%d",&x,&y);
  }
}

void find(int x,int y, int l){
  int i,j;
  if(x==Bx && y==By){
    if(l<lMin){
      for(i=0;i<10;i++)
	for(j=0;j<10;j++)
	  minBoard[i][j]=board[i][j];
    }
    return;
  }
  if(x<0 || x>=10 || y<0 || y>=10 || board[x][y]!=0) return;
  board[x][y]=l;
  find(x+1,y  ,l+1);
  find(x  ,y+1,l+1);
  find(x-1,y  ,l+1);
  find(x  ,y-1,l+1);
  board[x][y]=0;
}
ولی چون باید 100^4 حالت را چک کنه یعنی 200^2 یعنی 20^(10^2) یعنی تقریبا 20^(1000) یعنی 60^10 حالت که اگر بر فرض محال کامپیوتر بتونه 6^10 حالت در ثانیه رو چک کنه حدود 317 روز طول میکشه .

برای همین اگه راهنمایی داشته باشید که بشه الگوریتم سریعتری نوشت بفرمایید.
من یه برنامه نوشتم فقط 4 ثانیه زمان می برد استادمون گفت اصلا خوب نیست مال شما که دیگه...

اما راهنمایی در محل شورع یه عدد صفر بزارید تمام خانه هایی که می شه با یک قدم به اونها دسترسی داشت رو دو یک بزارید بعد تمام خانه هایی که می توان با دوقدم دسترسی داشت رو دو بزارید و به همین ترتیب تا زمانی ادامه بدید که خانه ی B عددی درونش قرار بگیره این عدد کوتاهترین فاصله ممکن است
برای پیدا کردن راه هم عدد ها رو دنبال کنید
Arash_j13 is offline   Reply With Quote
Old 04-12-2006, 07:54 PM   #80
Arash_j13
Registered User
 
Arash_j13's Avatar
 

Join Date: Feb 2005
Location: مشهد
Posts: 777
Send a message via MSN to Arash_j13 Send a message via Yahoo to Arash_j13
تمرین شما رو سعی می کنم بنویسم یه راه به نظرم رسیده

یه تمرین هم من می گم از کتاب C++ How to program فصل آرایه ها

چه جوری می شه توی یه صفحه شطرنج با یک اسب طی 64 حرکت تمام خونه ها صفحه رو طی کرد

یه راهنمایی هم داره توی کتاب اون رو هم می گم

باید سعی کنید به خونه هایی برید که احتمال رفتن به اونجا کمتره جدول احتمال خونه ها این شکلی هست
Code:
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
3,4,6,6,6,6,4,3
2,3,4,4,4,4,3,2
Arash_j13 is offline   Reply With Quote
Old 04-14-2006, 05:10 AM   #81
Trusted Member
mohammad_110
کاربر فعال برنامه نویسی
 

Join Date: Jan 2006
Posts: 60
Quote:
نوشته ای از Arash_j13
تمرین شما رو سعی می کنم بنویسم یه راه به نظرم رسیده

یه تمرین هم من می گم از کتاب C++ How to program فصل آرایه ها

چه جوری می شه توی یه صفحه شطرنج با یک اسب طی 64 حرکت تمام خونه ها صفحه رو طی کرد

یه راهنمایی هم داره توی کتاب اون رو هم می گم

باید سعی کنید به خونه هایی برید که احتمال رفتن به اونجا کمتره جدول احتمال خونه ها این شکلی هست
Code:
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
3,4,6,6,6,6,4,3
2,3,4,4,4,4,3,2
این روش رو یه جور واضحتر قبلا شنیده بودم که باید به خونه ای رفت که از اون خونه به کمترین خونه های ممکن بشه رفت.
حل مسئله:
(اصل برنامه 20 خطه بقیش کارای گرافیکیه و ... است).
Code:
#include<stdio.h>
#include<conio.h>
#define Cbakg 1
#define Cbakgtxt 2
#define Cbakgshattxt 4
#define Cbakgshatsiah 0
#define Cbakgshatsefid 7
void shat3(int x,int y,int nx,int ny,int tnx,int tny,int cse,int csi)
{
  int i,j,k,l,m=0;
  gotoxy(x,y);
  for(i=0;i<tny;i++)
    for(j=0;j<ny;j++){
      m++;
      for(k=0;k<tnx;k++){
	if((i+k)%2==0)
	  textbackground(cse);
	else
	  textbackground(csi);
	for(l=0;l<nx;l++)
	  cprintf(" ");
      }
      gotoxy(x,y+m);
    }
}

void main()
{
  int sh[12][12]={0};
  int h[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},
	       {-1,-2},{1,-2},{2,-1}};
  int k=0,x,y,step=1,xNew,yNew,num,minNum=9,minK;
  int l,i,j;
  char ch;
  textbackground(Cbakg);
  textcolor(Cbakgtxt);
  clrscr();

  /////////////
  //initialize

  for(i=0;i<12;i++){
    sh[i][0]=sh[i][1]=sh[i][10]=sh[i][11]=-1;
    sh[0][i]=sh[1][i]=sh[10][i]=sh[11][i]=-1;
  }
  cprintf("inter x,y ");
  scanf("%d%d",&x,&y);
  x=(x-1)%8+1;
  y=(y-1)%8+1;
  clrscr();
  cprintf("inter x,y  x=%d y=%d",x,y);
  x++;
  y++;
  sh[x][y]=step;

  /////////////////
  //begin calculate

  for(step=2;step<=64;step++){
    minNum=9;
    for(k=0;k<8;k++){
      xNew= x + h[k][0];
      yNew= y + h[k][1];
      if( sh[xNew][yNew] == 0){
	sh[xNew][yNew] = step;
	num=0;
	for(l=0;l<8;l++)
	  if(sh[ xNew + h[l][0] ][ yNew + h[l][1] ]==0) num++;
	if(num<minNum){
	  minNum=num;
	  minK=k;
	}
	sh[xNew][yNew] = 0;
      }
    }
    x= x + h[minK][0];
    y= y + h[minK][1];
    sh[x][y]=step;
  }

  //end calculate
  ///////////////

  ///////////////
  //output

  textcolor(Cbakgshattxt);
  shat3(10,1,8,3,8,8,Cbakgshatsiah,Cbakgshatsefid);
  for(i=0;i<8;i++)
    for(j=0;j<8;j++){
      if((i+j)%2==0)
	textbackground(Cbakgshatsiah);
      else
	textbackground(Cbakgshatsefid);
	gotoxy(j*8+13,i*3+2);
	cprintf("%2d",sh[i+2][j+2]);
    }
  textcolor(Cbakgtxt);
  textbackground(Cbakg);
  gotoxy(20,25);
  cprintf("if you want run step by step press y          ");
  ch=getch();
  if(ch=='y'||ch=='Y'){
    clrscr();
    shat3(10,1,8,3,8,8,Cbakgshatsiah,Cbakgshatsefid);
    textcolor(Cbakgshattxt);
    for(i=1;i<65;i++){
      for(j=0;j<8;j++)
	for(l=0;l<8;l++)
	  if(sh[j+2][l+2]==i){
	    if((l+j)%2==0)
	      textbackground(Cbakgshatsiah);
	    else
	      textbackground(Cbakgshatsefid);
	    gotoxy(l*8+13,j*3+2);
	    cprintf("%2d",i);
	    gotoxy(80,25);
	  }
      ch=getch();
      if(ch=='q'||ch=='Q')break;
    }
  }
}
تابع shat3 کار خاصی انجام نمیده فقط یک صفحه شطرنجی در محیط تکست ایجاد می کشه .
آرایه sh درسته که 12*12 هست ولی در واقع خود صفحه شطرنج هستش که به این صورت مقدار دهی اولیه کردم:
Code:
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
اینکار رو بخاطر این کردم که راحتتر بشه خارج شدن اسب از صفحه شطرنج رو چک کرد. خونه هایی که صفرند همون صفحه شطرنج رو تشکیل می دهند.

آرایه h هم که نحوه حرکت اسب رو شبیه سازی می کنه. هر کدوم از هشت جفت عددهای آرایه h یک حرکت اسب هست. و چون اسب از هر خونه حداکثر به هشت خانه بعدی می تونه بره پس آرایه h هشت جفت عدد داره.

این روش فقط چند حالت از میلیونها جواب رو میده. این سئوال رو قبلا در حالت کلیش رو مجبور بودم حل کنم یعنی تمام حالتهایی که اسب می تونه همه خونه ها رو در 64 حرکت بره .
اینطوری خیلی سخت تر میشه این هم بعنوان یک سئوال بهش فکر کنید . من قبلا حل کردم (کلا تغییرش دادم تا جواب این سئوال رو بدم) البته برنامه با این روش راه حل های زیادی رو پیدا می کنه ولی نمی تونه همه راه حل ها رو پیدا کنه باید 64^8 حالت رو چک کنه که در حدود همون برنامه قبلی در میاد (یعنی یکسال). توی سه یا چهار ساعت 3000 تا جواب رو بدست میاره (بستگی به نقطه شروع داره) برای همین کل جواب ها باید بیشتر از چند میلیون باشه.

حالا همین خودش دوباره سئوال باشه. یعنی برنامه ای که بتونه تمام راه حل ها رو بدست بیاره.
روش جالبی داره ولی سخت تره.

Last edited by mohammad_110; 04-14-2006 at 05:16 AM..
mohammad_110 is offline   Reply With Quote
Old 04-14-2006, 11:02 PM   #82
Arash_j13
Registered User
 
Arash_j13's Avatar
 

Join Date: Feb 2005
Location: مشهد
Posts: 777
Send a message via MSN to Arash_j13 Send a message via Yahoo to Arash_j13
خیلی قشنگ حل کردید راه حلی که من پیدا کردم واقعا در مقابل این مسخره است
سعی می کنم ایم سوالتون رو جواب بدمن ولی مطمئن نیستم که بتونم

در مورد سوال قبلیتون هم هنوز وقت نشده بهش فکر کنم
Arash_j13 is offline   Reply With Quote
Old 04-15-2006, 09:15 PM   #83
Trusted Member
mohammad_110
کاربر فعال برنامه نویسی
 

Join Date: Jan 2006
Posts: 60
Quote:
نوشته ای از Arash_j13
خب یه تمرین دیگه

یه صفحه n در n داریم
که بعضی از این خونه ها ورود ممنوع هست کوتاه ترین مسیر بین دو نقطه دلخواه A و B اگر فقط مجاز باشیم به سمت بالا و پاین و چپ راست حرکت کنیم و وارد خانه ها مموع نوشیم کدام است

برای راحتی n را 10 بگیرید و خانه های بلوکه شده و A B ه رو از کاربر در یافت کنید و مختصات خانه ها جواب به همراه طول مسیر رو چاپ کنید
راهنمایی خوبی بود . اینم حل مسئله:

Code:
#include<stdio.h>
#include<conio.h>

int board[10][10]={0},Ax,Ay,Bx,By,step=2;

void getABForbidenPlaces();
void find(void);

void main(){
  int i,j,x,y;
  clrscr();
  getABForbidenPlaces();
  find();
  clrscr();
  for(i=0;i<10;i++){
    for(j=0;j<10;j++)
      printf("%3d",board[i][j]);
    printf("\n");
  }

  x=Bx;y=By;
  textcolor(4);
  for(i=step;i>0;i--){
    gotoxy(3*(x+1)+1,y);
    cprintf("%3d",i);
    if(board[x+1][y]==i-1)x++;
    if(board[x][y+1]==i-1)y++;
    if(board[x-1][y]==i-1)x--;
    if(board[x][y-1]==i-1)y--;
  }
  getch();
}

void getABForbidenPlaces(){
  int x,y;
  do{
    printf("Enter A x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Ax=x;Ay=y;
  }while(x<=0 || x>10 || y<=0 || y>10);
  Ax--;Ay--;
  board[Ax][Ay]=1;
  do{
    printf("Enter B x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Bx=x;By=y;
  }while(x<=0 || x>10 || y<=0 || y>10 || board[Bx][By]==1);
  Bx--;By--;
  board[Bx][By]=-2;
  printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
  scanf("%d%d",&x,&y);
  while (x>0 && x<=10 && y>0 && y<=10 && board[x][y]==0 ){
    board[x][y]=-1;
    printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
    scanf("%d%d",&x,&y);
  }
}

void find(void){
  int i,j;
  while(1){
    for(i=0;i<10;i++){
      for(j=0;j<10;j++){
	if(board[i][j]==step-1){
	  if(board[i+1][j]==0)board[i+1][j]=step;
	  if(board[i+1][j]==-2){board[i+1][j]=step;return;}
	  if(board[i][j+1]==0)board[i][j+1]=step;
	  if(board[i][j+1]==-2){board[i][j+1]=step;return;}
	  if(board[i-1][j]==0)board[i-1][j]=step;
	  if(board[i-1][j]==-2){board[i-1][j]=step;return;}
	  if(board[i][j-1]==0)board[i][j-1]=step;
	  if(board[i][j-1]==-2){board[i][j-1]=step;return;}
	}

      }
    }
    step++;
  }
}
mohammad_110 is offline   Reply With Quote
Old 04-15-2006, 09:16 PM   #84
Trusted Member
mohammad_110
کاربر فعال برنامه نویسی
 

Join Date: Jan 2006
Posts: 60
Quote:
نوشته ای از Arash_j13
در مورد سوال قبلیتون هم هنوز وقت نشده بهش فکر کنم
حل کردن این دو تا سئوال برای من که خیلی سخت بود.
mohammad_110 is offline   Reply With Quote
Old 04-16-2006, 06:43 PM   #85
Arash_j13
Registered User
 
Arash_j13's Avatar
 

Join Date: Feb 2005
Location: مشهد
Posts: 777
Send a message via MSN to Arash_j13 Send a message via Yahoo to Arash_j13
فکر کنم این دومی اشتباه البته شاید هم من سر در نیاوردم جواب رو چه جوری مشخص می کنه
Arash_j13 is offline   Reply With Quote
Old 11-30-2006, 05:06 PM   #86
rezakhafan4u
Registered User
 
rezakhafan4u's Avatar
 

Join Date: Nov 2006
Posts: 14
[QUOTE=mohammad_110;


دمت گرم خیلی عالی توضیح دادی
اگه میشه یه همچین توضیحی رو واسه مساله برجهای هانوی و هشت وزیر هم بگو
مرسی
بای
rezakhafan4u is offline   Reply With Quote
Old 11-30-2006, 05:24 PM   #87
rezakhafan4u
Registered User
 
rezakhafan4u's Avatar
 

Join Date: Nov 2006
Posts: 14
البته برای برجهای هانوی و مساله هشت وزیر بیشتر یه توضیحی راجب الگوریتمش میخوام
مثل مساله حرکت اسب شطرنج که خیلی خوب توضیح دادید
ممنونم
فعلا بای
rezakhafan4u is offline   Reply With Quote
Old 12-01-2006, 09:07 AM   #88
Arash_j13
Registered User
 
Arash_j13's Avatar
 

Join Date: Feb 2005
Location: مشهد
Posts: 777
Send a message via MSN to Arash_j13 Send a message via Yahoo to Arash_j13
برج هانوی رو فعلا برات توضیح می دم هشت وزیر رو خواستی بیا حضوری برات توضیح بدم
توی برج هانوی ما قرار n ـا حلقه رو از برج a به برج c با کمک برج b انتقال بدیم برای اینکار باید n-1 حلقه رو منتقل کنیم به برج b اخریم حلقه رو بزرایم توی برج c و بایز این N-1 حلقه منتقل کنیم به برج c

پس یه مسئله جدید داریم
مسئله اینکه کا باید N-1 حلقه از برج a به برج b با کمک برج C منتقل بشن برای این کار باید n-2 حلقه رو به برج c منقل کنید بعد حلقه n-1 رو به برج b منتقل کنید و n-1 حلقه رو هم از برج c منتقل کنید به برج b

پس باز هم یه مسئله جدید داریم
مسئله اینکه مامی خوایم n-2 حلقه رو از برج a به برج c منتقل کنیم باید N-3 حلقه رو به برج b منتقل کنیم حلقه N-3 رو بزریم توی برج c و اون n-2 حلقه رو بزاریم توی برج c

و به همین ترتیب باز یه مسئله جدید داریم
.....
.....

این کار رو باید اینقدر انجام بدیم که تعداد حلقه هایی که قرار جا به جای بشن فقط یه دونه باشه که جواب این حالت هم روشنه

Code:
#include <iostream>
#include <cstdlib>

#define MOVE " ----> "
using namespace std;

int honoy(int,char ,char,char);
int main()
{
	honoy(5,'A','B','C');
	system("pause");
	return EXIT_SUCCESS;
}

int honoy(int n,char from,char help,char to)
{
	if (n<0)
	{
		cout<<"Error\n";
		exit(0);
	}
	if(n==1)
	{
		cout<<from<<MOVE<<to<<endl;
		return 1;
	}
	int m=honoy(n-1,from,to,help);
	cout<<from<<MOVE<<to<<endl;
	m+=honoy(n-1,help,from,to);
	return m+1;
}
اگه جاییش رو نفهمیدی بگو بیشتر توضیح بدم
Arash_j13 is offline   Reply With Quote
Old 12-12-2006, 06:31 PM   #89
rezakhafan4u
Registered User
 
rezakhafan4u's Avatar
 

Join Date: Nov 2006
Posts: 14
خيلي ممنونم
اگه ميشه برنامه هشت وزير رو طوري كه تمام 92 حالت ممكن رو برامون چاپ كنه رو بنويسيد
البته هم با تابع بازگشتي و هم بدون اون ...
البته بازم ميگم >>>>>> اگه سورسشو آماده داريد يا نوشتنش راحته ...
مرسي
باي عزيزم
rezakhafan4u is offline   Reply With Quote
Old 12-12-2006, 08:08 PM   #90
shahab_sh
Registered User
 
shahab_sh's Avatar
 

Join Date: May 2006
Posts: 86
سلام
راستش من 5-6 ماه بیشتر نیست که رفتم سراغ برنامه نویسی و خیلی حرفه ای نیستم. الان هم دارم کتاب عین الله جعفر نژاد قمی رو میخونم و تازه رسیدم به بخش وراثت. این تاپیک رو هم تازه پیدا کردم و تمام پستهاش رو هم خوندم.دستتون درد نکنه تمرینات خیلی خوبی هست. توی صفحه قبل یه سوال بود:

Quote:
برنامه ای بنویسید که یک عبارت محاسباتی شامل اعادا صحیح عملیات چهار گانه +-*/ را از کاربر دریافت کند این عبارت می تواند شامل پرانتز نیز باشد بعد نتیجه عبارت رو محاسبه و گزارش کنه
من این سوال رو 2-3 هفته پیش حل کرده بودم.که کدش رو میزارم اینجا:
شما عبارت رو هر جور که بخواید میتونید وارد کنید. خود برنامه درستش میکنه. اگر هم کاراکتر هایی غیر از +-*/() (و اعداد) وارد کنید ویا عبارت بی معنی مانند:
Code:
236-*543
بنویسید برنامه ارور میده و مکان ارور رو هم مشخص میکنه. دلیل اینکه یه خورده هم طولانی شده همینه.
مثلا عبارت زیر را در نظر بگیرید:
Code:
-22 * -762/  (21+(45- (70/10+23(10-(56/8))-20 + 8 * 80/8)))  - 29
اینم کد برنامه:

Code:
#include<iostream.h>
#include<conio.h>
#include<string.h>

class snt {
	char alsns[201];

	public:

	int input();
	long int calc_all(char*, int&);
	void ch_int(long int &,int &,char*);
	long int calc();
	int ill();

};
int snt::input(){
	int i,j,k;

	clrscr();
	cout << "Enter an Expression:\n";
	cin.get(alsns,120);
	if(ill() == -1)
		return -1;

	return 1;
}
int snt::ill(){
	int i,j,k;
	char chngd[201],a,b,c;

	for(j=1,i=0; alsns[i]; i++){
		for(a=1; alsns[i-a]==' '; a++);
		a = alsns[i-a];

		b=alsns[i];
		
		for(c=1; alsns[i+c]==' '; c++); 
		c = alsns[i+c];

		if(b == '-' || b == '+'){				//-+
			switch (a) {
				case '+':case '-':case '*':case '/':case '(':case ')':case '\0': break;
				default:
					if(a>=47 && a<= 57)	break;
					else j=-1;
			}
			switch (c) {
				case '+':case '-':case '(':	break;
				default:
					if(c>=47 && c<= 57)	break;
					else j=-1;
			}
		}
		else if(b == '*' || b == '/'){			// */
			switch (a) {
				case ')': break;    
				default:
					if(a>=47 && a<= 57)	break;
					else j=-1;
			}
			switch (c) {
				case '-':case '+':case '(':	break;    
				default:
					if(c>=47 && c<= 57)	break;
					else j=-1;
			}		
		}
		else if(b == '('){ 						// (
			switch (a) {
				case '+': case '-':case '*':case '/':case '(':case ')':case '\0': break;    
				default:
					if(a>=47 && a<= 57)	break;
					else j=-1;
			}
			switch (c) {
				case '-':case '+':case '(':	break;    
				default:
					if(c>=47 && c<= 57)	break;
					else j=-1;
			}
		}
		else if(b == ')'){						// )
			switch (a) {
				case ')': break;
				default:
					if(a>=47 && a<= 57)	break;
					else j=-1;
			}
			switch (c) {
				case '+': case '-':case '*':case '/':case '(':case ')':case '\0': break;
				default:
					if(c>=47 && c<= 57)	break;
					else j=-1;
			}
		}
		else if( !((b>=48 && b<=57) || b==' ' || b=='\0')){
			j=-1;
			break;
		}
	}
	if(j==-1){
		cout << "\n\nerror at character No." << i <<"  at: " << &alsns[i] <<"\n";

		return -1;
	}

	//j=row     k=cloumn
	for(j=0,i=0; alsns[i]; i++){
		for(a=1; alsns[i-a]==' '; a++);
		a = alsns[i-a];

		b = alsns[i];

		for(c=1; alsns[i+c]==' '; c++);
		c = alsns[i+c];

		if(b!= ' ') {
			if(b == '('){
				if(a=='/' || a=='*' )
					chngd[j++] = '(';
				else{
					if(a==')' || (a>=48 && a<=57))
						chngd[j++] = '*';
					chngd[j++] = '1';
					chngd[j++] = '*';
					chngd[j++] = '(';
                }

			}else if(b== ')'){
				chngd[j++] = ')';
				if(c>=48 && c<=57){
					chngd[j++] = '*';
				}

			}else{
				chngd[j++] = b;
				if(b == '-' || b == '+'){
					chngd[j++] = '1';
					chngd[j++] = '*';
				}
			}
		}
	}
	chngd[j]=0;

	cout << "\nchanged = " << chngd << "\n";

	for(i=0; chngd[i]; i++)
		alsns[i] = chngd[i];
	alsns[i]=0;

	return 1;

}
long int snt::calc(){
	int i=0;
	return calc_all(alsns,i);
}
long int snt::calc_all(char *exp, int&i){
	int sign=1;
	long int adad1,adad2,sum=0;
	char amal,ns;


	do{

////////////////////////////////////////

		sign = 1;
		if(*(exp+i)=='-'){
			sign = -1;
			i++;
		}
		else if(*(exp+i)=='+')
	  		i++;

		ch_int(adad1,i,exp);
		adad1 *= sign;

		while(1){
			amal = ns = 0;
			switch (*(exp+i)) {
				case '-':
				case '+':
					ns = 1;
					break;
				case ')':
					i++;
					break;
				case '*':
					amal = '*';
					i++;
					break;
				case '/':
					amal = '/';
					i++;
			}

			if(!amal || ns)
				break;

			sign = 1;
			if(*(exp+i)=='-'){
				sign = -1;
				i++;
			}
			else if(*(exp+i)=='+')
				i++;

			if(*(exp+i) == '(')
				adad2 = calc_all(exp,++i);
			else
				ch_int(adad2,i,exp);
			adad2*=sign;

			switch(amal){
				case '*':
					adad1*=adad2;
					break;
				case '/':
					adad1/=adad2;
			}
////////////////////////////////////////
		}
		sum+=adad1;

	}while(ns);


	return sum;
}
void snt::ch_int(long int &adad, int &i, char *exp){

	for(adad=0; *(exp+i) >= 48 && *(exp+i) <= 57; i++)
		adad = adad*10 + *(exp+i)-48;

}
int main(){

	snt snt1;
	while(snt1.input() == -1){
		cout <<"\ninvalid expression!\n";
		getch();
	}
	cout << "\nanswer is: " << snt1.calc();
	getch();
	return 0;
}



قربان شما....شهاب.
__________________
www.best-circuits.com
این سایت شامل مدارهای الکترونیکی، مطالب و ebook های مربوط به الکترونیک و نرم افزارهای الکترونیک میباشد

Last edited by shahab_sh; 12-12-2006 at 08:56 PM..
shahab_sh is offline   Reply With Quote
Reply

امکانات بيشتر

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +4.5. The time now is 09:53 PM.

PersianTools RSS Feeds


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.