![]() |
|
|
#76 |
|
Registered User
|
خب یه تمرین دیگه
یه صفحه n در n داریم که بعضی از این خونه ها ورود ممنوع هست کوتاه ترین مسیر بین دو نقطه دلخواه A و B اگر فقط مجاز باشیم به سمت بالا و پاین و چپ راست حرکت کنیم و وارد خانه ها مموع نوشیم کدام است برای راحتی n را 10 بگیرید و خانه های بلوکه شده و A B ه رو از کاربر در یافت کنید و مختصات خانه ها جواب به همراه طول مسیر رو چاپ کنید
__________________
|
|
|
|
|
|
#77 | |
|
کاربر فعال برنامه نویسی
Join Date: Jan 2006
Posts: 60
|
Quote:
من یه برنامه نوشتم البته اشکال برنامه ای نداره ولی ... اول برنامه : 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;
}
برای همین اگه راهنمایی داشته باشید که بشه الگوریتم سریعتری نوشت بفرمایید.
__________________
Last edited by mohammad_110; 04-15-2006 at 09:14 PM.. |
|
|
|
|
|
|
#78 |
|
کاربر فعال برنامه نویسی
Join Date: Jan 2006
Posts: 60
|
خوب راستی منم یک سئوال بگم .
این سئوال یکمی شبیه اون سئوالیه که باید مقدار ریاضی یک رشته از اعداد و علامت ها رو محاسبه می کرد هستش. سئوال اینه که دو تا رشته داریم که در این دو رشته دو عبارت ریاضی داریم و برنامه باید تشخیص بده که این دو رشته از لحاظ عبارت ریاضی با هم معادل هستند مثل: Code:
(a+b-c)*2 (a+a)+(b*2-(3*c)+c قواعد کار: 1- دو تا رشته لازم نیست از کاربر گرفته بشند و می تونند بصورت متغییر داخل برنامه تعریف بشند. 2- طول رشته ها حداکثر 80 کاراکتر هست و کاراکتر space یا فضای خالی بین کاراکتر ها وجود ندارد. 3- متغییر های عبارت ریاضی یک حرفی هستند. 4- اعداد تک رقمی هستند. 5- پرانتز های چپ و راست مجاز هستند 6- عملگرهای +و - و * استفاده می شوند (توجه کنید که تقسیم نداریم) 7- هر کدام از رشته ها صرفنظر از معادل بودن یا نبودن با دیگری دارای خطای ریاضی نیستند .(مثلا از لحاظ مساوی بودن پرانتز های باز و بسته و... و احتیاجی به چک کردن ندارند.) یک مثال دیگه : Code:
(a+b)*(a+b) -2*a*b+b*b+a*a+4*a*b |
|
|
|
|
|
#79 | |
|
Registered User
|
Quote:
اما راهنمایی در محل شورع یه عدد صفر بزارید تمام خانه هایی که می شه با یک قدم به اونها دسترسی داشت رو دو یک بزارید بعد تمام خانه هایی که می توان با دوقدم دسترسی داشت رو دو بزارید و به همین ترتیب تا زمانی ادامه بدید که خانه ی B عددی درونش قرار بگیره این عدد کوتاهترین فاصله ممکن است برای پیدا کردن راه هم عدد ها رو دنبال کنید |
|
|
|
|
|
|
#80 |
|
Registered User
|
تمرین شما رو سعی می کنم بنویسم یه راه به نظرم رسیده
یه تمرین هم من می گم از کتاب 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 |
|
|
|
|
|
#81 | |
|
کاربر فعال برنامه نویسی
Join Date: Jan 2006
Posts: 60
|
Quote:
حل مسئله: (اصل برنامه 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;
}
}
}
آرایه 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.. |
|
|
|
|
|
|
#82 |
|
Registered User
|
خیلی قشنگ حل کردید راه حلی که من پیدا کردم واقعا در مقابل این مسخره است
سعی می کنم ایم سوالتون رو جواب بدمن ولی مطمئن نیستم که بتونم در مورد سوال قبلیتون هم هنوز وقت نشده بهش فکر کنم |
|
|
|
|
|
#83 | |
|
کاربر فعال برنامه نویسی
Join Date: Jan 2006
Posts: 60
|
Quote:
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++;
}
}
|
|
|
|
|
|
|
#84 | |
|
کاربر فعال برنامه نویسی
Join Date: Jan 2006
Posts: 60
|
Quote:
|
|
|
|
|
|
|
#85 |
|
Registered User
|
فکر کنم این دومی اشتباه البته شاید هم من سر در نیاوردم جواب رو چه جوری مشخص می کنه
|
|
|
|
|
|
#86 |
|
Registered User
Join Date: Nov 2006
Posts: 14
|
[QUOTE=mohammad_110;
دمت گرم خیلی عالی توضیح دادی اگه میشه یه همچین توضیحی رو واسه مساله برجهای هانوی و هشت وزیر هم بگو مرسی بای |
|
|
|
|
|
#87 |
|
Registered User
Join Date: Nov 2006
Posts: 14
|
البته برای برجهای هانوی و مساله هشت وزیر بیشتر یه توضیحی راجب الگوریتمش میخوام
مثل مساله حرکت اسب شطرنج که خیلی خوب توضیح دادید ممنونم فعلا بای |
|
|
|
|
|
#88 |
|
Registered User
|
برج هانوی رو فعلا برات توضیح می دم هشت وزیر رو خواستی بیا حضوری برات توضیح بدم
توی برج هانوی ما قرار 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;
}
|
|
|
|
|
|
#89 |
|
Registered User
Join Date: Nov 2006
Posts: 14
|
خيلي ممنونم
اگه ميشه برنامه هشت وزير رو طوري كه تمام 92 حالت ممكن رو برامون چاپ كنه رو بنويسيد البته هم با تابع بازگشتي و هم بدون اون ... البته بازم ميگم >>>>>> اگه سورسشو آماده داريد يا نوشتنش راحته ... مرسي باي عزيزم |
|
|
|
|
|
#90 | |
|
Registered User
Join Date: May 2006
Posts: 86
|
سلام
راستش من 5-6 ماه بیشتر نیست که رفتم سراغ برنامه نویسی و خیلی حرفه ای نیستم. الان هم دارم کتاب عین الله جعفر نژاد قمی رو میخونم و تازه رسیدم به بخش وراثت. این تاپیک رو هم تازه پیدا کردم و تمام پستهاش رو هم خوندم.دستتون درد نکنه تمرینات خیلی خوبی هست. توی صفحه قبل یه سوال بود:Quote:
شما عبارت رو هر جور که بخواید میتونید وارد کنید. خود برنامه درستش میکنه. اگر هم کاراکتر هایی غیر از +-*/() (و اعداد) وارد کنید ویا عبارت بی معنی مانند: 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 های مربوط به الکترونیک و نرم افزارهای الکترونیک میباشد email: bc@best-circuits.com
Last edited by shahab_sh; 12-12-2006 at 08:56 PM.. |
|
|
|
|
![]() |
| امکانات بيشتر | |
|
|