PDA

View Full Version : آموزش: مسئله پر پیچ و خم



quiet_programmer
پنج شنبه 19 خرداد 1390, 16:32 عصر
با سلام.

دوستان کد مسئله پرپیچ و خم رو خواسته بودن منم این تاپیک رو ایجاد کردم، تا شاید به درد دوستان دیگه بخوره

البته قبل از همه چیز بخاطر اینشکل برنامه نویسی معذرت خواهی میکنم. چون من اینو ترم دو کاردانی بودم که نوشتم و اونوقت از نحوه نوشتن برنامه ها بصورت آبجکت اورینتت بی اطلاع بودم.

تو مرحله اول برنامه یه ماتریس دو بعدی 10*10 رو با اعداد تصادفی صفر و یک ایجاد میکنه.

صفرها به معنی وجود راه و یکها به معنی بسته بودن راه

70949


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

70948

و در نهایت مسیری که موش پیمایش کرده رو نشون میده. در صورتی که راهی نباشه برای خروج پیغام میده

70950

70951

#define sa 10
#define so 10
#define mss sa*so
#define True 1
#define False 0
#include <conio.h>
#include <stdio.h>
#include<STDLIB.H>
#include <time.h>

struct offsets
{
int vert;
int horize;
} ;
static struct offsets move[8]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
struct element
{
int row;
int col;
int dir;
};
struct element stack[mss];
int maze [sa+2][so+2];
int mark [sa+2][so+2];
int flag;
int top;
/************************************************** *************/
main()
{
time_t t;
int i,p,vsa,vso,esa,eso,l;
int row,col,dir,next_row,next_col;
int found=False;
clrscr();
for(i=0;i<sa+2;i++)
for(p=0;p<so+2;p++)
mark[i][p]=0;
for (i=0;i<sa+2;i++)
{
maze[i][0]=1;
maze[i][so+1]=1;
}
for (i=0;i<so+2;i++)
{
maze[0][i]=1;
maze[sa+1][i]=1;
}
srand((unsigned) time(&t));
for (i=1;i<=sa;i++)
for (p=1;p<=so;p++)
maze[i][p]=rand()%2;
for (i=1;i<=sa;i++)
{
for(p=1;p<=so;p++)
printf("%d",maze[i][p]);
printf("\n");
}
printf("Enter The Input Row=");
scanf("%d",&vsa);
printf("Enter The Input Col=");
scanf("%d",&vso);
printf("Enter The Output Row=");
scanf("%d",&esa);
printf("Enter The Output Col=");
scanf("%d",&eso);
while ((vsa<1 || vsa>sa)||(vso<1 ||vso>so)||(maze[vsa][vso]!=0)||(vsa!=1 && vsa!=sa && vso!=1 && vso!=so))
{
printf("Error\n");
printf("prees any key...");
getch();
clrscr();
for (i=1;i<=sa;i++)
{
for(p=1;p<=so;p++)
printf("%d",maze[i][p]);
printf("\n");
}

printf("Enter The Input Row=");
scanf("%d",&vsa);
printf("Enter The Input Col=");
scanf("%d",&vso);
printf("Enter The Output Row=");
scanf("%d",&esa);
printf("Enter The Output Col=");
scanf("%d",&eso);
}
mark[vsa][vso]=1;
top=0;
stack[0].row=vsa;
stack[0].col=vso;
stack[0].dir=0;
while(top>-1 && !found)
{
row=stack[top].row;
col=stack[top].col;
dir=stack[top].dir;
top--;
while(dir<8 && !found)
{
next_row=row+move[dir].vert;
next_col=col+move[dir].horize;
if(next_row==esa && next_col==eso)
found=True;
else if(!maze[next_row][next_col] && !mark[next_row][next_col])
{
mark[next_row][next_col]=1;
top++;
stack[top].row=row;
stack[top].col=col;
stack[top].dir=dir++;
row=next_row;
col=next_col;
dir=0;
}
else ++dir;
}
}
if (found)
{
for(i=0;i<=top;i++)
printf("%2d %5d\n",stack[i].row,stack[i].col);
printf("%2d %5d\n",row,col);
printf("%2d %5d\n",esa,eso);
for(i=1;i<=sa;i++)
{
for(p=1;p<=so;p++)
{
for(l=0;l<=top;l++)
if((stack[l].row==i && stack[l].col==p) || (row==i && col==p)||(esa==i && eso==p))
flag=True;
if(flag)
{
textcolor(4);
cprintf("%d",maze[i][p]);
}
else
{
textcolor(15);
cprintf("%d",maze[i][p]);
}
flag=False;
}
printf("\n");
}
}
else
printf("The Maze Dose Not Have A Path");
getch();
}

mehdi67ma
دوشنبه 23 خرداد 1390, 12:01 عصر
مرسی.خیلی کامله.:تشویق::تشویق:

mehdi67ma
سه شنبه 24 خرداد 1390, 14:02 عصر
اگه لطف کنی درباره خود برنامه و حلقه ها و پشته به صورت خط به خط توضیحی بنویسی ممنون میشم