| 
    
     | 
       
        | כותב |  |  
        | אסף אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          מישהו יכול בבקשה לעזור לי עם השאלה הזאת, ממש ניתקעתי איתה, צריך לפתור אותה ברקורסיה ואין לי מושג איך עושים את זה...
           | | נשלח בתאריך: 14 December 2007 בשעה 22:19 | | IP רשוּם | 
 |   |  
           | 
 |  
 
 שאלה 5   רוצים להושיב
k סטודנטים הנבחנים בבחינה
בשורה אחת המכילה n
כסאות. ידוע ש  1-n ≥   2k.  על מנת למנוע העתקות בבחינה הוחלט שבין כל שני נבחנים יהיה לפחות כסא ריק אחד. את סדר
הישיבה יתאר מערך, students,
באורך n
שאבריו הם 0 ו-1.
 נסמן ב Students[i]=0 אם הכסא ה-
i י ריק, ו- Students [i]=1 אם קיים נבחן היושב בכסא
ה--i-י. (הכיסאות
ממוספרים מ 0 עד n-1). כתבו פונקציה
המקבלת את המערך  students  ואת הפרמטריםn  ו- k ומדפיסה את כל האפשרויות
למקם את הנבחנים. לדוגמא, עבור
n=5, k=2 על
הפונקציה להדפיס את כל הישיבות האפשריות של הסטודנטים. 00101 01001 01010 10001 10010 10100   הפונקציה
יכולה לקבל פרמטרים נוספים אם יש צורך. אם
לא ניתן למצוא סידור כזה הפונקציה לא מדפיסה דבר.יש לי את התוכנית עצמה במחשב אז אם מישהו לא מבין את השאלה בבקשה תפנו אלי ואני ישלח לכם את התוכנה, אפשר לפנות אלי דרך המסנג'ר. asi_malki1@walla.com
 
 תודה מראש.
 אסף.
 
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          כתבתי ב-CPP, נקווה שאתה יודע איך להמיר...
           | | נשלח בתאריך: 15 December 2007 בשעה 09:46 | | IP רשוּם | 
 |   |  
           | 
 |  
 
 
| קוד: 
 
    
    | 
      
       | void PrintPossibilitiesInner(bool* arr, int n, int k, int i) {
 if(k == 0)
 {
 for (int i = 0 ; i < n ; ++i)
 cout << arr[i] << ' '; // replace with printf
 cout << endl; // replace with printf
 return;
 }
 if ((n+1-i)/2 < k) // this also includes i >= n
 return;
 PrintPossibilitiesInner(arr, n, k, i+1);
 arr[i] = true;
 PrintPossibilitiesInner(arr, n, k-1, i+2);
 arr[i] = false;
 }
 |  |  |  
 הקריאה הראשונה לפונקציה היא בערך כזאת:
 
 
 
| קוד: 
 
    
    | 
      
       | void PrintPossibilities(int n,int k) {
 bool* arr = new bool[n];
 for (int i = 0 ; i < n ; ++i)
 arr[i] = false;
 PrintPossibilitiesInner(arr, n, k, 0);
 }
 |  |  |  |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | אסף אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          מצטער, שכחתי להגיד שאסור להשתמש בלולאות בכלל...
           | | נשלח בתאריך: 15 December 2007 בשעה 09:51 | | IP רשוּם | 
 |   |  
           | 
 |  אבל תודה על התגובה.
 
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          הלולאות פה זה רק בשביל ההדפסה והאתחול של המערך.
           | | נשלח בתאריך: 15 December 2007 בשעה 13:30 | | IP רשוּם | 
 |   |  
           | 
 |  
 את ההדפסה אין לי רעיון איך אתה יכול להכניס בפורמט הנוכחי להכניס לפונקציה
 הרקורסיבית, אבל אולי תממש גם אותה בעזרת רקורסיה...
 
 את האתחול אתה מוזמן לעשות ע"י ההקצאה של C שמאתחלת גם את הערכים בזכרון
 שהוקצה (calloc).
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | אסף אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          טוב, אז אחרי שהימרתי את זה לC והוספתי פונקציה שמדפיסה בצורה רקורסיבית, הגעתי לדבר הזה
           | | נשלח בתאריך: 15 December 2007 בשעה 19:03 | | IP רשוּם | 
 |   |  
           | 
 |  
 
| קוד: 
 
    
    | 
      
       | #include<stdio.h>
 
 void PrintArray(int students[], int n);
 void CheckSeats(int students[], int n, int k, int i);
 
 #define MAX 100
 
 void main(){
 int students[MAX] = {0}, k, n;
 printf("Please enter number of students: ");
 scanf("%d", &k);
 printf("Please enter number of seats: ");
 scanf("%d", &n);
 CheckSeats(students, n - 1, k, 0);
 }
 
 void CheckSeats(int students[], int n, int k, int i)
 {
 if(k == 0)
 {
 PrintArray(students, n);
 printf("\n");
 return;
 }
 if ((n+1-i)/2 < k)
 return;
 CheckSeats(students, n, k, i+1);
 students = 1;
 CheckSeats(students, n, k-1, i+2);
 students = 0;
 }
 
 
 void PrintArray(int students[], int n){
 if (n > 0)
 PrintArray(students, n - 1);
 printf("%d", students[n]);
 }
 
 |  |  |  
 אולם זה עדיין לא עובד לי לגמרי, רק כמעט, למשל עבור קלט של 2 סטודנטים ו5 כיסאות, במקום
 
 00101 01001 01010 10001 10010 10100 זה מדפיס לי רק את האפשרויות הבאות 01010 10010 10100יש לך אולי מושג למה זה קורה?
 
 ושוב, תודה על העזרה, ממש תרגיל מעצבן.
 
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | shoshan מנהל האתר
 
  
  
 הצטרף / הצטרפה: 16 July 2005
 מדינה: Israel
 משתמש: מנותק/ת
 הודעות: 4637
 | 
          כי לא היית צריך להעביר N-1 אלא פשוט N
           | | נשלח בתאריך: 15 December 2007 בשעה 20:02 | | IP רשוּם | 
 |   |  
           | 
 |  
 אגב, תרגיל נחמד ואני מקווה שהבנת את הפתרון.
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | זה עובד!!! אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          אחי, אתה תותח.
           | | נשלח בתאריך: 15 December 2007 בשעה 20:41 | | IP רשוּם | 
 |   |  
           | 
 |  ישבתי באמת הרבה על הדבר הזה אבל שום דבר לא זז...
 תודה רבה.
 
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | 11010010110 פורומיסט על
 
  
  
 הצטרף / הצטרפה: 23 April 2006
 משתמש: מנותק/ת
 הודעות: 2621
 | 
          
           | | נשלח בתאריך: 16 December 2007 בשעה 00:37 | | IP רשוּם | 
 |   |  
           | 
 |  
| קוד: 
 
    
    | 
      
       | # include <stdio.h> 
 # define N 11
 # define K 5
 
 int x (int ,int ,int) ;
 void w (int) ;
 
 int main ( )
 {
 if (!x (4 ,N ,K)) printf ("no possible combinations") ;
 return 1 ;
 }
 
 int x (i ,n ,k)
 {
 if (k > (n + ! (i % 2)) / 2) return 0 ;
 if (n < 1) { w (i) ; return 1 ; }
 return (x (2 * i ,n - 1 ,k) + (k && !(i % 2) && x (2 * i + 1 ,n - 1 ,k - 1))) ;
 }
 
 void w (i)
 {
 if (i == 4) { printf ("\n\n") ; } else { w (i / 2) ; printf ("%d" ,i % 2) ; }
 return ;
 }
 |  |  |  
 |  
        | חזרה לתחילת העמוד |     |  
        |  |  
        | אסף אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          זאת עוד דרך?
           | | נשלח בתאריך: 16 December 2007 בשעה 09:31 | | IP רשוּם | 
 |   |  
           | 
 |  |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | אסף אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          shoshan, שמתי לב שבתוכנית שרשמת פה, זה מדפיס אפס אחד מיותר, כאילו במקום להדפיס למשל 00101, זה מדפיס 001010, האפס הימני מיותר, יש לך מושג למה זה עושה את זה ואיך אפשר להיפתר מזה?
           | | נשלח בתאריך: 20 December 2007 בשעה 12:19 | | IP רשוּם | 
 |   |  
           | 
 |  
 תודה מראש.
 
 |  
        | חזרה לתחילת העמוד |       |  
        |  |  
        | אסף אורח
 
  
 
 הצטרף / הצטרפה: 01 October 2003
 משתמש: אונליין
 הודעות: 12647
 | 
          לא משנה, תיקנתי את זה, שלחתי לפונקצית הדפסה שלי n במקום n-1.
           | | נשלח בתאריך: 20 December 2007 בשעה 12:23 | | IP רשוּם | 
 |   |  
           | 
 |  |  
        | חזרה לתחילת העמוד |       |  
        |  |  |  |