Logo

רד-בורד: ארכיון

ראשי > תיכנות > פיתוח אלגוריתם לסודוקו

31/05/2006 16:06:06 devil kide
תקשיבו אנשים, בזמן האחרון ראיתי קצת זמן חופשי ורציתי לכתוב איזה פותר סודוקו.
עכשיו התחלתי לעבוד עליו ונתקעתי בקטע של הבדיקה, אם מישהו יכול לתת לי טיפה כיוון,או איזה שהיא המלצה-קוד מקור של מישהו אחר יהיה נחמד.

אני עובד על הקוד ב -C , אבל אם מישהו יכתוב אפילו בשפה אחרת גם יהיה טוב, אני אשתדל להבין.[ההודעה נערכה על-ידי tal ב-05/06/2006 23:43:32]
01/06/2006 03:38:41 devil kide
יש לי עכשיו קצת יותר זמן להסביר ת’עצמי.
אני אגיד איפה בדיוק נתקעתי, בבקשה תנו יד:
*לאחר שקלטתי את המספרים למערך דו מימדי איך אני אגרום למחשב לא לשנות אותם-הרי נניח שבזמן הבדיקה לולאה מסויימת אמורה להעלות את המספרים, עכשיו זה יותר מדי פעולות IF , וגם יצא לי הרבה בעיות.

*בזמן הבדיקה נסיתי לעבוד עם 9 משתנים, עכשיו אני לא מצליח לעשות שהמתשתנים יעלו בסדר מיוחד-בהתחלה כל המערך יהיה1 ורק המספר האחרון יעלה באחד, מין מונה כזה , שהוא יגיע לשתיי שני מספירים יעלו וכו’.
זה באמת תוכנית קשה, טל אולי תעשה את זה כאתגר.
01/06/2006 15:56:20 tal
תשמע... הבעייה עם כזאת תוכנית זה לעשות את זה באופן חכם.. כי סתם בדיקה זה לא קשה לעשות..
הדרך הבסיסית שאני חושב עלייה זה הדרך הפשוטה של להכניס מספרים ושיבדוק מול השורה, עמודה וקובייה... למרות שלא יודע...

אני צריך לחשוב על זה יותר לעומק...
אבל תנסה קודם לקחת דף ולרשום בכל מצב מה אמורים לעשות... זה יקל על הבניית האלגוריתם..
01/06/2006 17:22:47 devil kide
זה בעיה מאוד מורכבת, בגדול זה נשמע מאוד קל, אבל שמגיעים לדרך המעשית זה נהיה חתיכת עבודה.
טל, לדעתי תהפוך את זה לאתגר, ככה שאני אראה קוד מקור זה יעזור לי, וככה גם תוכל להתחיל עם האתגרים בצורה יפה ולא צריך לדעת תכנות ברמה גבוהה אלא חכמה.
02/06/2006 16:13:16 tal
יש שיטה מסויימת כדי לפתור את הסודוקו.. אח שלי יודע איך לעשות אותה, ברגע שהוא ילמד אותי מה בידיוק הדרך שבה פותרים את הסודוקו אני אוכל לשפר את הקוד שכתבתי לפתרון של זה... (זה ביינתים נראה יותר כמו BruteForcer מאשר פותר סודוקו..)
וברגע שיהיה לי פתרון אולי נעשה מזה אתגר.. :-)
03/06/2006 09:18:09 xtr
חחח בשביל שיהיה לך קוד מקור צריך לעשות אתגר :|

שמע אני לא הבנתי איך אתה הולך לפתור את זה :\

אם אתה רוצה אני חושב שבdrvb יש קוד מקור לזה ...

תראה תדרך שלו אולי זה יעזור :|
(אני יודע שזה בvb )
03/06/2006 13:21:55 tal
הרעיון זה לא להסתכל על קוד מקור של מישהו אחר... אלא ליצור אחד בעצמך...
אני מנסה לעשות את זה בשתי דרכים,
א. בערך פרוצדורלית
ב. עם שימוש חזק ב- OOP...
נראה מה יצא..
03/06/2006 21:47:29 devil kide
טל, תקשיב, אני ממא משתגע אני מנסה לפתור ולא מצליח, יש מצב אתה שולח לי בפרטי את הקוד שכתבת?
אני אתן עוד כמה נקודות למחשבה לשיפור הקוד-איך שיהייה יותר מהיר:
בעיקרון כמו שאתם יודעים אי אפשר שבאותו שורה\עמודה\ריבוע-קטן יהיהו את אותם מספרים, בדיקה שתבדוק אם זה ככה תקצר את הקוד בלפחות איזה 50% מזמן הריצה שלו.

xtr,בזמן שאנשים יפתרו את האתגר וישלחו לטל תפתרונות טל יראה את הדרך ויבין איך זה עובד, איזה קוד הכי טוב ויעיל וכו’...
04/06/2006 22:06:16 ziv
devil kide אתה צריך קודם לחשוב על רעיון רק אחר כך לכתוב קוד.
אם יש לך אלגוריתם לא אמור להיות בעיה לממש אותו, פתירת סודוקו לא אמור להצריך יותר מידי ידע בשפת התיכנות שתבחר.
לכן קודם הרעיון ואחר כך הקוד, אם אתה לא מצליח לממש את הרעיון בשפת התיכנות תקרא מדריכים לאותה השפה ואני בטוח שאתה תצליח.
בהצלחה.
05/06/2006 22:42:17 devil kide
זיו, תודה על העזרה, פשוט כנראה לא הבנת אותי.

אני חשבתי על רעיון ודרך פיתרון, פשוט נתקעתי בכמה מקומות-לכן בקשתי עזרה.

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


שוב, אם למישהו יש קוד אני יודה לו אם הוא ישתף אותי.
07/06/2006 00:52:06 avaz
אני פעם חשבתי על אלגוריתם , פשוט לא היה לי כח לממש אותו קבל :
נתון לנו מערך של סודוקו.
1.האלגוריתם רץ כל עוד כל המשבצות לא מלאות.
2. עבור כל משבצץ ריקה , לפי חוקי הסודוקו חשב את כל האפשרויות שאפשר לשים בא
3. אם יש לך משבצת שיש בא רק אפשרות אחת מלא את המשבצת
ואז חשב מחדש את כל האפשרויות של המשבצות הריקות על הלוח
אם לא לך אל המשבצת שיש בה הכי מעט אפשרויות
, בחר אחת שמור את הלוח לפני ההשמה ואת האפשרות השניה של המשבצת.

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

אם לא הבנת תגיד אני אכתוב לך את זה בפייטון אולי זה יעזור
07/06/2006 17:11:33 xtr
נראה לי שהדרך הכי פשוטה זה לעשות תנאי מקונן וזהו

נכון שזה כמו ברוטאל פורס

אבל זה לא יקח לו יותר מ 5 דקות לפתור את הסודוקו ....
07/06/2006 23:20:50 tal
ברוטאל פורס? אתה מתכוון אם כבר ל- Brute Force (זה נשמע יותר כמו ברוט פורס או כוח ברוטאלי בעברית)... וכן.. זה מה שהוא הציע בעיקרון...
הדרך היותר חכמה זה לקחת את צורת הבדיקה הקיימת (יש שיטה ממש שפותרת את הסודוקו בלי לחזור אחורה) ולנסות לכתוב אותה...
08/06/2006 11:42:21 nickless
אולי תקחו סודוקו פתור ותנסו למצוא איזשהו כלל או תבנית?
אני משער שאם יש משהו כזה זה אמור לתת לכם את הפתרון[ההודעה נערכה על-ידי nickless ב-08/06/2006 11:42:43]
09/06/2006 10:34:18 Ratinho
באיזה קטע נתקעת?
היה לי שלשום מבחן של סוף הקורס האקדמי (הראשון) בC, אז היתה שם שאלה להכין פונקציה שמקבלת מערך דו מימדי, (9*9) ובודקת אם הוא סודוקו תקין..
זה ממש קליל (במבחן כמו מפגר שכחתי לבדוק את העמודות והשורות, בדקתי רק את הריבועים הקטנים.. לא נורא, יש מועד ב’..)
09/06/2006 12:20:32 devil kide
ratinho, אם יהיה לך זמן ותכתוב משהו בפיתון אני מאוד אודה לך, זה מאוד יעזור לי, תודה.
09/06/2006 19:45:13 tal
ציטוט:באיזה קטע נתקעת?
היה לי שלשום מבחן של סוף הקורס האקדמי (הראשון) בC, אז היתה שם שאלה להכין פונקציה שמקבלת מערך דו מימדי, (9*9) ובודקת אם הוא סודוקו תקין..
זה ממש קליל (במבחן כמו מפגר שכחתי לבדוק את העמודות והשורות, בדקתי רק את הריבועים הקטנים.. לא נורא, יש מועד ב’..)

לבדוק שהוא תקין זאת לא הבעייה
להכניס את הערכים ככה שהוא יהיה תקין זאת הבעיה...
09/06/2006 21:01:33 ziv
גם זה לא בעיה...
פשוט צריך לדעת כמה שיטות לפתירת סודוקו ולממש אותן בשפת התיכנות.
ואני לא ממליץ להשתמש בברוטל פורס.
10/06/2006 16:38:36 Eran
לדעתי צריך מערך תלת ממדי [9][9][10] לייצוג הסודוקו: שני הממדים הראשונים משמשים להצגת הסודוקו והמימד השלישי משמש לאפשרויות בכל משבצת כשאפשר לסמן ש0 זה שאין אפשרות כזו ו-1 יש אפשרות כזו.

האלגוריתם לבדיקה יכול להיות:
אם יש ערך במקום [j[[0] אז עבור על כל השורה i והטור j והורד את האפשרות. כדי לסמן את המלבן שבו נמצאת המשבצת אפשר להשתמש בשארית (נהוג לסמן כmod או כ% בשפות מסוימות) בצורה הבאה:
אם i%3=0 אז צריך לסמן את המשבצות עם i+1 וi+2. אם i%3=1 צריך לסמן את המשבצות i-1 וi+1. אם i%3=2 צריך לסמן את המשבצות i-1 וi-2. כך גם לגבי שורות, גם לגבי טורים, ולגבי שניהם יחד.

ברגע שיש רק אפשרות אחת- סמן אותה. לולאת do תעבור שוב ושוב על הסודוקו עד שייגמר. בנוסף צריך משתנה נוסף שיודיע שאם הdo חוזר על עצמו ללא שינוי צריך ניחוש.
27/06/2006 18:49:17 xtr
http://dr-vb.co.il/forum/show_msg.php?id=131267&forum_id=0
עמודים: 1