עזרה עם אלגוריתם

Alkhimey

New member
עזרה עם אלגוריתם

נתונה מטריצה ריבועית. יש למצאו את העובר על האלכסונים. יש לי כבר פתרון, אבל הוא לא יפה ולא אלגנטי, ודורש להתייחס לשני מקרים: כאשר האלכסון מתחיל בחלק העליון של המטריצה או כאשר הוא מתחיל בחלק השמאלי (או הימני אם רוצים לעבור על האלכסונים "המשניים"). כל מקרה צריך לולאה נפרדת, ובתוך הלולאה יש לולאה מקוננת שעוברת על כל תא כל זה מסורבל מאוד והייתי רוצה לדעם אם יש דרך פשוטה יותר? או לחילופין האם יש דרך לעבור על השפה העליונה והשמאלית של המערך בעזרת לולאה אחת? תודה מראש.
 

vinney

Well-known member
לא ממש הבנתי את הבעיה

אתה יכול להדגים מה בדיוק חסר לך?
 

Alkhimey

New member
הסבר

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

vinney

Well-known member
ואיך אתה סורק?

אם אתה סורק לוח ובודק אם יש עליו משהו - באסה לך. אני במקומך הייתי סורק איפה יש לשחקן מסוים סימונים ובודק אם הם רציפים בכיוון כלשהו.
 

Alkhimey

New member
לא הבנתי

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

vinney

Well-known member
לא, אני לא רוצה שתסרוק שום מערך

תסרוק את המיקומים של שחקנים.
 

Maha Vailo

New member
יש לי פתרון אבל...

הרבה יותר קשה להבין אותו. לפי דעתי קודם כל עדיף לעשות את זה פשוט בשתי לולאות, אבל אם אתה רוצה להתנסות עם לולאה אחת אז נסה את זה
for i=1 to 2n-1 **steps = n - | n-i | **for j=1 to steps ****square(1-j+(steps+i)/2, j+(i-steps)/2)​
כשהקריאה האחרונה היא הקורדינטות של התא במערך (1...N), כשהפינה העליונה שמאלית היא 1,1. ודי קשה לי להסביר את זה ככה שאני שוב מציע להשתמש פשוט בשתי לולאות. הרבה יותר פשוט להבנה, וזה לא מעלה את הסיבוכיות או משהו כזה. בכל מקרה, לפי דעתי עדיף לך לחפש דרך אחרת לסרוק את הלוח. בהצלחה
 
למעלה