כותב |
|
java אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 04 December 2007 בשעה 13:56 | | IP רשוּם
|
|
|
|
בלוח דו-ממדי בגודל m ´ n, אשר כל אחת ממשבצותיו יכולה להיות ריקה או מלאה, נקרא כתם לרצף משבצות מלאות בעלות צלע משותפת או קדקוד משותף.
גודל הכתם הוא מספר המשבצות המרכיבות את הכתם.
ייתכנו מספר כתמים בלוח.
דוגמה:
נסמן משבצת מלאה באמצעות התו ´ ומשבצת ריקה באמצעות תו רווח.
הלוח
4 |
3 |
2 |
1 |
0 |
|
´ |
|
|
´ |
|
0 |
´ |
´ |
|
|
´ |
1 |
|
´ |
´ |
|
|
2 |
|
|
|
|
´ |
3 |
|
|
´ |
´ |
´ |
4 |
מכיל 3 כתמים:
כתם המורכב ממשבצות (1, 0), (0, 1) וגודלו 2.
כתם המורכב ממשבצות (3, 2), (2, 2), (4, 1), (3, 1), (4, 0) וגודלו 5.
כתם המורכב ממשבצות (2, 4), (1, 4), (0, 4), (0, 3) וגודלו 4.
כתבו שיטה רקורסיבית המקבלת כפרמטר מערך דו-ממדי המייצג לוח כמתואר לעיל, וזוג מספרים שלמים המייצגים תא במערך. השיטה תחזיר את גודל הכתם המכיל תא זה. אם התא אינו חלק מכתם, יוחזר אפס.
חתימת השיטה תהיה:
public static int stain (int [][] mat, int row, int col)
לדוגמה: עבור המערך מהדוגמה הקודמת וזוג המספרים (3, 1) יוחזר 5, ועבור זוג המספרים (4, 4) יוחזר אפס.
|
חזרה לתחילת העמוד |
|
|
decimal משתמש פעיל
הצטרף / הצטרפה: 08 November 2007
משתמש: מנותק/ת הודעות: 118
|
נשלח בתאריך: 04 December 2007 בשעה 15:08 | | IP רשוּם
|
|
|
|
אני יכול לשנות את המערך במהלך הפתרון ( לשים תו רווח במקום שהיה את התו השני ) ? כי אם כן זה יחסית לא קשה
|
חזרה לתחילת העמוד |
|
|
java אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 04 December 2007 בשעה 15:24 | | IP רשוּם
|
|
|
|
היי.גם אני חשבתי על לשנות את התאים במערך לתו מסויים כדי לא לספור תא פעמיים.צריך לפתור את הבעיה מבלי לשנות את המערך.חשבתי אולי להעתיק את המערך למערך אחר בעזרת שיטה פרטית ובו לשנות את הערכים(לא יודע אם מותר)...אני יכול לפתור את הבעיה לפי מה שכתבת בעזרת לולאות...איך עושים את זה בעזרת רקורסיה?
תודה
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 04 December 2007 בשעה 16:02 | | IP רשוּם
|
|
|
|
זה לא כלכך הגיוני בלי לשנות כי איך תדע אם כבר התחשבת במשבצת הזו או לא ?
|
חזרה לתחילת העמוד |
|
|
java אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 December 2007 בשעה 13:48 | | IP רשוּם
|
|
|
|
איך אפשר לפתור את התרגיל ע"י שינויים במערך בעזרת רקורסיה?
תודה
|
חזרה לתחילת העמוד |
|
|
decimal משתמש פעיל
הצטרף / הצטרפה: 08 November 2007
משתמש: מנותק/ת הודעות: 118
|
נשלח בתאריך: 05 December 2007 בשעה 15:37 | | IP רשוּם
|
|
|
|
אני לא יודע JAVA אבל פתרתי ב C# שזה דומה עם לשנות את המערך :
קוד:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { char[,] a = new char[5, 5]; Console.Write("row : "); int row = int.Parse(Console.ReadLine()); Console.Write("col : "); int col = int.Parse(Console.ReadLine()); Console.WriteLine("insert chars :"); ReadArray(a); Console.Clear(); PrintArray(a); Console.WriteLine(GetCount(a, row, col)); } static int GetCount(char[,] a, int i, int j) { int localCounter = 0; if (a[i, j] == '`') { if ((i == 0) || (i == a.GetLength(0) - 1) || (j == 0) || (j == a.GetLength(1) - 1)) { a[i, j] = ' '; return 1; } else { a[i, j] = ' '; localCounter = localCounter + 1; localCounter = localCounter + GetCount(a, i + 1, j); localCounter = localCounter + GetCount(a, i + 1, j + 1); localCounter = localCounter + GetCount(a, i, j + 1); localCounter = localCounter + GetCount(a, i - 1, j + 1); localCounter = localCounter + GetCount(a, i - 1, j); localCounter = localCounter + GetCount(a, i - 1, j - 1); localCounter = localCounter + GetCount(a, i, j - 1); localCounter = localCounter + GetCount(a, i - 1, j - 1); } } return localCounter; } static void ReadArray(char[,] a) { int i, j; for (i = 0; i < a.GetLength(0); i++) { for (j = 0; j < a.GetLength(1); j++) { a[i, j] = char.Parse(Console.ReadLine()); } } } static void PrintArray(char[,] a) { int i, j; for (i = 0; i < a.GetLength(0); i++) { for (j = 0; j < a.GetLength(1) - 1; j++) { Console.Write(a[i, j] + "|"); } Console.WriteLine(a[i, j]); } } } }
|
|
|
|
חזרה לתחילת העמוד |
|
|
decimal משתמש פעיל
הצטרף / הצטרפה: 08 November 2007
משתמש: מנותק/ת הודעות: 118
|
נשלח בתאריך: 05 December 2007 בשעה 15:43 | | IP רשוּם
|
|
|
|
אגב איך מתכתנים ב JAVA ב WINDOWS ? ( ומקמפלים ? ) מה צריך ?
|
חזרה לתחילת העמוד |
|
|
java אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 December 2007 בשעה 16:14 | | IP רשוּם
|
|
|
|
היי תודה רבה!
אני לא מבין c אבל אני אנסה בכל זאת לנסות לתרגם את זה איכשהו ל-java...
כדי לכתוב תוכנית ב-java ב-windows צריך מהדר.יש הרבה מהדרים וכל אחד בוחר לו מהדר שנוח לו לעבוד איתו.
|
חזרה לתחילת העמוד |
|
|
java אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 December 2007 בשעה 16:35 | | IP רשוּם
|
|
|
|
decimal אתה יכול להסביר לי בבקשה במילים מה עשית?כי אני לא מבין את זה ולא מצליח לתרגם לג'אוה כי יש דברים שונים.תסביר לי בבקשה מה התנאי הבסיסי ומה צעד(צעדי) הרקורסיה.לא צריך להעתיק למערך אחר אלא אפשר לעשות את השינויים על המערך שהתקבל(קודם אני אנסה להבין את זה ואח"כ נראה איך אוכל לשפר זאת).
|
חזרה לתחילת העמוד |
|
|
decimal משתמש פעיל
הצטרף / הצטרפה: 08 November 2007
משתמש: מנותק/ת הודעות: 118
|
נשלח בתאריך: 05 December 2007 בשעה 18:13 | | IP רשוּם
|
|
|
|
אני תמיד פותר בדרכים מוזרות שאני כמעט בטוח שאף אחד מלבדי לא היתי פותר בהם ובגלל זה אני גם גרוע בהסברים אבל אני אנסה :
קוד:
char[,] a = new char[5, 5]; Console.Write("row : "); int row = int.Parse(Console.ReadLine()); Console.Write("col : "); int col = int.Parse(Console.ReadLine()); Console.WriteLine("insert chars :"); ReadArray(a);
|
|
|
הכנסת המערך , קליטת המיקום המבוקש , וקליטת כול התווים למערך
מדפיס את המערך באופן דו מימדי ככה שתראה אותו יפה כזה
קוד:
Console.WriteLine(GetCount(a, row, col));
|
|
|
עכשיו מזמין את הפונקציה ומדפיס את מה שהיא מחזירה שזה בעצם גודל הכתם במערך a בשורה row בעמודה col ועכשיו לפונקציה : localCounter הוא בעיקרון תמיד סופר את הכתמים שקשורים לריצה המסויימת הזאת ואת כול הפונקציות שאחרות שהיא הזמיה בצעד הרקורסיבי ומחזירה אותם לפונקציה שהזמינה אותה הוא מתחיל מ 0 כי תמיד מתחילים לספור מ 0
שים לב זה התנאי העיקרי , אם הוא לא מתקיים ז"א שזה לא כתם או חלק מכתם ואז מחזירים את localCounter שמקודם שמנו בו 0 אז זה מתאים כי אם אין כתם אז הגודל שלו יהיה אפס כול זה אם אין כתם והתנאי לא מתקיים , אם הוא כן מתקיים :
קוד:
if ((i == 0) || (i == a.GetLength(0) - 1) || (j == 0) || (j == a.GetLength(1) - 1))
|
|
|
זה בודק אם התא הוא לא תא שבסוף או תחילת המערך ז"א התא הראשון או האחרון לאורך או לרוחב כי אם כן אז מחשיבים אותו ( שים לב ששמים רווח במקום שלו כדי לא להחשיב אותו עוד הפעם ומחזירים 1 ( כי התא הזה מכיל ` אחד אז צריך להחשיב אותו ) והנה הצעד הרקורסיבי :
קוד:
a[i, j] = ' '; localCounter = localCounter + 1; localCounter = localCounter + GetCount(a, i + 1, j); localCounter = localCounter + GetCount(a, i + 1, j + 1); localCounter = localCounter + GetCount(a, i, j + 1); localCounter = localCounter + GetCount(a, i - 1, j + 1); localCounter = localCounter + GetCount(a, i - 1, j); localCounter = localCounter + GetCount(a, i - 1, j - 1); localCounter = localCounter + GetCount(a, i, j - 1); localCounter = localCounter + GetCount(a, i - 1, j - 1);
|
|
|
הסבר : שמים בו רווח כדי לא להחשיב אותו שוב מוסיפים אחד כדי לספר אותו ואז מזמינים את הפונקציה עם כול התאים המקיפים אותו זהו בעיקרון מקווה שתבין מציע לך להוריד visual c# express זה בחינם כדי שתוכל להריץ קודם ב C# ולהבין איך הם עובדים ותביא שם של איזה COMPILER ל JAVA בשביל WINDOWS נגיד מה שאתה משתמש בו
|
חזרה לתחילת העמוד |
|
|
inHaze משתמש פעיל
הצטרף / הצטרפה: 23 November 2006 מדינה: Israel
משתמש: מנותק/ת הודעות: 119
|
נשלח בתאריך: 05 December 2007 בשעה 18:49 | | IP רשוּם
|
|
|
|
decimal כתב:
אגב איך מתכתנים ב JAVA ב WINDOWS ? ( ומקמפלים ? ) מה צריך ? |
|
|
Java יכולה לרוץ מעל כל מע' הפעלה בגלל ה: JVM - Java Virtual Machine
__________________ הבלוג שלי
|
חזרה לתחילת העמוד |
|
|
java אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 December 2007 בשעה 20:20 | | IP רשוּם
|
|
|
|
אוקיי תודה רבה decimal!
|
חזרה לתחילת העמוד |
|
|
java אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 December 2007 בשעה 20:28 | | IP רשוּם
|
|
|
|
זה קומפיילר קל יחסית לאחרים...יש קומפיילרים אחרים יותר קשים שצריך נסיון כדי לעבוד איתם.
|
חזרה לתחילת העמוד |
|
|
java אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 05 December 2007 בשעה 21:55 | | IP רשוּם
|
|
|
|
תרגמתי לג'אוה...הבנתי את הרעיון שלך אבל הוא לא עובד...ניסיתי 1,3 במערך שבשאלה ומוחזר 5 שזה בסדר אבל במקרים אחרים זה לא עובד למשל 4,2 מחזיר 1(צריך להחזיר 4)
זה המערך שבדקתי עליו (כמו בשאלה) :
private static char mat [][] = { {' ' , 'x' , ' ' , ' ' , 'x'}, {'x' , ' ' , ' ' , 'x' , 'x'}, {' ' , ' ' , 'x' , 'x' , ' '}, {'x' , ' ' , ' ' , ' ' , ' '}, {'x' , 'x' , 'x' , ' ' , ' '}, } ;
public static int GetCount(char[][] a, int i, int j) { int localCounter = 0; if (a[i][j] == 'x') { if ((i == 0) || (i == a.length - 1) || (j == 0) || (j == a.length - 1)) { a[i][j] = ' '; return 1; } else { a[i][j] = ' '; localCounter++; localCounter+=GetCount(a,i-1,j-1); localCounter+=GetCount(a,i-1,j); localCounter+=GetCount(a,i-1,j+1); localCounter+=GetCount(a,i,j-1); localCounter+=GetCount(a,i,j+1); localCounter+=GetCount(a,i+1,j-1); localCounter+=GetCount(a,i+1,j); localCounter+=GetCount(a,i+1,j+1); } } return localCounter; }
|
חזרה לתחילת העמוד |
|
|
אורח אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 06 December 2007 בשעה 02:48 | | IP רשוּם
|
|
|
|
לdecimal יש לך טעות, אל תבדוק תאים באלכסון. כי זה לא מבטיח שזהו "כתם". תבדוק רק ימין,שמאל,למטה ולמעלה.
|
חזרה לתחילת העמוד |
|
|
decimal משתמש פעיל
הצטרף / הצטרפה: 08 November 2007
משתמש: מנותק/ת הודעות: 118
|
נשלח בתאריך: 06 December 2007 בשעה 05:13 | | IP רשוּם
|
|
|
|
אוקי לא בדקתי טוב את הראשון ויש שם טעות , לגבי מה שאמרו פה על לא לבדוק אלכסון אני ב 99% בטוח שזה לא נכון וכן צריך לבדוק את האלכסון שימו לב לתא 0,1 שיש שם אחד ועוד אחד באלכסון למטה , אם לא היתי בודק את האלגון זה היה מחזיר 1 אז אני כן חושב שצריך לבדוק את האלכסון ועכשיו תיקנתי בדקתי את זה על כמה דוגמאות ואני חושב שזה נכון :
קוד:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { char[,] a = new char[5, 5]; a[0, 0] = ' '; a[0, 1] = 'x'; a[0, 2] = ' '; a[0, 3] = ' '; a[0, 4] = 'x'; a[1, 0] = 'x'; a[1, 1] = ' '; a[1, 2] = ' '; a[1, 3] = 'x'; a[1, 4] = 'x'; a[2, 0] = ' '; a[2, 1] = ' '; a[2, 2] = 'x'; a[2, 3] = 'x'; a[2, 4] = ' '; a[3, 0] = 'x'; a[3, 1] = ' '; a[3, 2] = ' '; a[3, 3] = ' '; a[3, 4] = ' '; a[4, 0] = 'x'; a[4, 1] = 'x'; a[4, 2] = 'x'; a[4, 3] = ' '; a[4, 4] = ' '; Console.Write("row : "); int row = int.Parse(Console.ReadLine()); Console.Write("col : "); int col = int.Parse(Console.ReadLine()); //Console.WriteLine("insert chars :"); //ReadArray(a); Console.Clear(); PrintArray(a); Console.WriteLine(GetCount(a, row, col)); } static int GetCount(char[,] a, int i, int j) { int localCounter = 0; if ((i < 0) || (i >= a.GetLength(0)) || (j < 0) || (j >= a.GetLength(1))) { return 0; } if (a[i, j] != 'x') { return 0; } a[i, j] = ' '; localCounter = 1; localCounter += GetCount(a, i + 1, j); localCounter += GetCount(a, i + 1, j + 1); localCounter += GetCount(a, i, j + 1); localCounter += GetCount(a, i - 1, j + 1); localCounter += GetCount(a, i - 1, j); localCounter += GetCount(a, i - 1, j - 1); localCounter += GetCount(a, i, j - 1); localCounter += GetCount(a, i - 1, j - 1); return localCounter; } static void ReadArray(char[,] a) { int i, j; for (i = 0; i < a.GetLength(0); i++) { for (j = 0; j < a.GetLength(1); j++) { a[i, j] = char.Parse(Console.ReadLine()); } } } static void PrintArray(char[,] a) { int i, j; for (i = 0; i < a.GetLength(0); i++) { for (j = 0; j < a.GetLength(1) - 1; j++) { Console.Write(a[i, j] + "|"); } Console.WriteLine(a[i, j]); } } } }
|
|
|
|
חזרה לתחילת העמוד |
|
|
צחי@ משתמש חבר
הצטרף / הצטרפה: 02 January 2007 מדינה: Israel
משתמש: מנותק/ת הודעות: 209
|
נשלח בתאריך: 06 December 2007 בשעה 09:52 | | IP רשוּם
|
|
|
|
חבר'ה, אני יודע שיש שביתה - אבל זאת לא סיבה לכתוב תגובות ב-5:13 לפנות בוקר (אלא אם כן אתה עובד כמחלק עיתונים או משהו כזה) :)
|
חזרה לתחילת העמוד |
|
|
decimal משתמש פעיל
הצטרף / הצטרפה: 08 November 2007
משתמש: מנותק/ת הודעות: 118
|
נשלח בתאריך: 06 December 2007 בשעה 12:55 | | IP רשוּם
|
|
|
|
קמתי באטרף לפתור תרגיל וגם לנצל את השביתה שבקרוב תגמר
|
חזרה לתחילת העמוד |
|
|
|
|