עבור לתוכן

בעיה ב C - מבוכים

Featured Replies

פורסם

עשיתי תוכנית שמכניסים לה מבוך ע"י שימוש ב 0 ו 1 היא מציגה את הדרך לפתרון (לפחות ככה זה אמור להיות)

אין שגיאות אני מצליח להריץ אבל התוכנית לא עושה את שלה.

להלן הקוד עם הערות:

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

// Print the maze //
void draw (char array[10][10])
{
int i,n;
system ("cls");
printf("\n");
for (i=0;i<10;i++)
{
printf(" -----------------------------------------------------------\n");
for (n=0;n<10;n++)
{
printf(" | %c |",array[i][n]);
if (n==9)
printf ("\n");
}
if (i==9)
printf(" -----------------------------------------------------------\n");
}
}
// Print the maze //

int main()
{
char maze[10][10]={0};
int i=0, n=0;
draw (maze);

// Enter maze (Using 0 & 1) //
for (i=0;i<10;i++)
for (n=0;n<10;n++)
{
maze[i][n]=getch();
draw (maze);
}
// Enter maze (Using 0 & 1) //

// Where to go //
while (i+n != 18)
{
while (maze[i][n+1]!= 0 && n+1 < 11)
{
n++;
maze[i][n]=='*';
}

if (maze[i+1][n] == 0 || maze[i-1][n] == 0)
{
maze[i][n]=0;
n--;
}

while (maze[i+1][n] != 0 && i+1 < 11)
{
i++;
maze[i][n]=='*';
}

if (maze[i][n+1] == 0 || maze[i][n-1] == 0)
{
maze[i][n]=0;
i--;
}
}
// Where to go //

draw (maze);
printf ("Press ESC to exit\n");
while (getch() != 27)
continue;
return 0;
}

תודה לעוזרים [:

פורסם

2 טעויות ב 2 ה WHILE הפנימיים

 maze[i][n]=='*';

תתקן ל

 maze[i][n]='*';

ותגיד אם עכשיו זה עובד.

[br]פורסם בתאריך: 21.11.2007 בשעה 16:36:23


עוד נקודה בעייתית.

לאחר שאתה מכניס את ה 0 וה 1 לתוך המבוך ומגיע ל WHILE, ה I ו ה N שלך שווים ל 10, זה יוצר לך בעייה בתנאי עצירה וגלישה מהמערך בפנייה ל

maze[i][n+1]

אתה גולש בכמה וכמה מקומות.

אני לא בטוח מה אתה מנסה לעשות בלולאה, אבל בכל מקרה, תאפס את המשתנים.

פורסם
  • מחבר

זה עדיין לא פתר את הבעיה ותודה רבה בכל מקרה אני לא מאמין שלא שמתי לב לזה..

אה הבנתי את הבעיה לא שמתי לב שעשיתי שימוש ב I ו N תודה

עכשיו זה מדפיס אבל לא את הדרך..

עזרו לי.. ]:

עריכה:

תיקנתי כמה דברים אבל זה כל הזמן עושה את אותה דרך..

כשאני משנה בלולאה את תנאי ה וגם ל קטן מ 10 זה עושה משהו אבל עדיין לא נכון למרות שאני צריך לעשות קטן מ 11.

אחרי תיקון:

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

// Print the maze //
void draw (char array[10][10])
{
int i,n;
system ("cls");
printf("\n");
for (i=0;i<10;i++)
{
printf(" -----------------------------------------------------------\n");
for (n=0;n<10;n++)
{
printf(" | %c |",array[i][n]);
if (n==9)
printf ("\n");
}
if (i==9)
printf(" -----------------------------------------------------------\n");
}
}
// Print the maze //

int main()
{
char maze[10][10]={0};
int i,n;
draw (maze);

// Enter maze (Using 0 & 1) //
for (i=0;i<10;i++)
for (n=0;n<10;n++)
{
maze[i][n]=getch();
draw (maze);
}
// Enter maze (Using 0 & 1) //

// Where to go //
i=0; n=0;
while (i+n != 18)
{
while (maze[i][n+1]!= 0 && n+1 < 10)
{
n++;
maze[i][n]='*';
}

if (maze[i+1][n] == 0 || maze[i-1][n] == 0)
{
maze[i][n]=0;
n--;
}

if (i+n == 18 )
break;
while (maze[i+1][n] != 0 && i+1 < 10)
{
i++;
maze[i][n]='*';
}

if (maze[i][n+1] == 0 || maze[i][n-1] == 0)
{
maze[i][n]=0;
i--;
}
}
// Where to go //

draw (maze);
printf ("Press ESC to exit\n");
while (getch() != 27)
continue;
return 0;
}

למה זה תמיד עושה אותו דבר?!

פורסם

אפשר את הקוד החדש?

שאלה, אם יש 0 זה אומר שאפפשר לעבוד ו 1 אומר שחסום?

פורסם
  • מחבר

אפשר את הקוד החדש?

שאלה, אם יש 0 זה אומר שאפפשר לעבוד ו 1 אומר שחסום?

כן..

הינה אחד יותר חדש:

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

// Print the maze //
void draw (char array[10][10])
{
int a,b;
system ("cls");
printf("\n");
for (a=0;a<10;a++)
{
printf(" -----------------------------------------------------------\n");
for (b=0;b<10;b++)
{
printf(" | %c |",array[a][b]);
if (b==9)
printf ("\n");
}
if (a==9)
printf(" -----------------------------------------------------------\n");
}
}
// Print the maze //

int main()
{
char maze[10][10]={0};
int i,n;
draw (maze);

// Enter maze (Using 0 & 1) //
for (i=0;i<10;i++)
for (n=0;n<10;n++)
{
maze[i][n]=getch();
draw (maze);
}
// Enter maze (Using 0 & 1) //

// Where to go //
i=0; n=0;
if (maze[i][n] != 0)
{
maze [i][n] = '*';
while (i+n != 18 )
{

while (maze[i][n+1]!= 0 && n+1 < 11)
{
n++;
maze[i][n]='*';
}

if (maze[i+1][n] == 0 || maze[i-1][n] == 0)
{
maze[i][n]=0;
n--;
}

if (i+n == 18 )
break;

while (maze[i+1][n] != 0 && i+1 < 11)
{
i++;
maze[i][n]='*';
}

if (maze[i][n+1] == 0 || maze[i][n-1] == 0)
{
maze[i][n]=0;
i--;
}
}
}
// Where to go //

draw (maze);
printf ("\n Press ESC to exit \n");
while (getch() != 27)
continue;
return 0;
}

פורסם

תשתמש ברקורסיה.

פורסם
  • מחבר

תשתמש ברקורסיה.

כבר אמרו לי את זה.. אבל אני לא ינסה להשתמש ברקורסיה לפני שאני יצליח בלי.

אז בכל זאת למה זה לא עובד?

פורסם

אתה צריך להשתמש ברקורסיה או מחסנית לפחות. רקורסיה הרבה יותר פשוט.

פורסם

רקורסיה זה הפיתרון הכי קלסי והכי פשוט..

זה יקצר לך את הקוד בחצי, אבל ידרוש יותר משאבים ואולי גם זמן, אם היעילות פחות חשובה לך..

לסוג הזה של הרקוסרסיה קוראים back tracking, ממליץ לך לקרוא:

http://www.google.co.il/search?hl=iw&q=back+tracking&meta=

אם אתה מחפש דוגמאות טובות לשימוש בסוג הזה של הרקורסיה תסתכל על "9 המלכות" ואיך לפתור לוח סודוקו..

פורסם

כן ;)

פורסם
  • מחבר

תודה על הקישור אני אעבור על זה.

לגבי הרקורסיה כמו שאמרתי זה דורש יותר מחשבה מה שאומר שאם לא הבנתי למה זה לא עובד אז כיהיו לי שגיאות ברקורסיה קל וחומר.

ואם אתה כאלו חכמים אולי תסתכלו על הקוד הפשוט שלי ותגידו לי מה לא טוב בבקשה.

פורסם

הפתרון הרקורסיבי הוא הרבה יותר אינטואיטיבי.. ברגע שתצליח אותו, יהיה לך הרבה יותר קל לחשוב על הפיתרון האיטרטיבי...

אל תפחד מרקורסיה, זאת סתם מילה.. :)

פורסם

התרגיל הזה עניין אותי ופתרתי אותו.

אם אתה רוצה הדרך שבא פתרתי אותו (קרוב לוודאי שאותה דרך שהאחרים דיברו עליה) היא:

(מתחילים מנקודת ההתחלה) בודקים לאיזה כיוונים אפשר להתקדם (למעלה, ימינה...)

אם אפשר הולכים למעלה (ז"א קוראים לאותה פונקציה אם y שונה), אם לא הולכים ימינה... עד שמגיעים או למבוי סתום או לסוף המבוך.

אם הגענו לסוף מחזירים 1, אם הגענו למבוי סתום מחזירים 0. עכשיו המופע של הפונקציה (אם כך קוראים לזה) שקיבל 1 מחזיר לפונקציה שקראה לו 1 וכן הלאה..

אם הגעת למבוי סתום אז במופע של הפונקציה שקיבלה 0 תנסה להתקדם בכיוון אחר אם אפשר, אם אי אפשר אז תחזיר 0 וכן הלאה.

(הפתרון הזה לא מגיע לדרך הקצרה ביותר, אך פתרון נכון מובטח)

מקווה שהבנת את הרעיון :).

אם יש לך עוד תרגילים בסגנון אני אשמח אם תשלח לי.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים