应用回溯算法寻找毕业的最小学期数

Posted

技术标签:

【中文标题】应用回溯算法寻找毕业的最小学期数【英文标题】:Application of Backtracking algorithm to find minimum number of semester to graduate 【发布时间】:2013-07-10 16:10:40 【问题描述】:

我正在从包含

的文件中获取输入
    每学期课程数量和最大允许课程数 所有课程名称(最多 5 个字母数字) 课程名称、提供的 sem、prereq 数量、Prereq 课程。 -1 和 -1 结尾 输出将是完成所有课程的最少学期数。

这是我的代码,以便您知道我已经完成了工作。我的代码正在编译和执行,但没有显示完成课程的 sem 数量。 请告诉我哪里做错了

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
#include<ctype.h>

char garbage[12][6];
char courseIdentifier[12][6],prereqIdentifier[12][5][6];
char semOffered[12];
bool done[12];

bool allDone(int);
bool donePrereq(int,int);

int main(void)

    FILE *fp;
    fp = fopen("graduate.in","r");
    int n,m,p;
    int i,j,k;
    for(i=0;i<12;i++)
    
        strcpy(courseIdentifier[i],"");
    
    for(i=0;i<12;i++)
    
        for(j=0;j<5;j++)
        
            strcpy(prereqIdentifier[i][j],"");
        
    
    fscanf(fp,"%d %d",&n,&m);// take n,m
    while(n != -1)
    

        if( !(1<=n && n<=12) || !(2<=m && m<=6) )
        
            printf("Wrong input");
        
        for(i=0;i<n;i++) //the list of offered courses
        
            fscanf(fp,"%s",garbage[i]);
        
        for(i=0;i<n;i++)
        
            fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered,&p);//the name of course, sem,no. of prereqs
            for(j=0;j<p;j++)
            
                fscanf(fp,"%s",prereqIdentifier[i][j]);
            
        

        int sem=1;
        char semNow = 'F';
        for(i=0;i<n;i++)
        
            done[i]=false;
        
        while(!allDone(n))
        
            int count=0;
            //while(count<=m)
            //
                for(i=0;i<n;i++)
                
                    if( (semOffered[i]==semNow || semOffered[i]=='B') && donePrereq(p,n))
                    
                        done[i] = true;
                        count++;
                    
                

            //
            sem++;
            if(semNow=='F')
            
                semNow='S';
            
            else if(semNow=='S')
            
                semNow='F';
            
        
        printf("minimum number of semesters = %d\n",sem);
        fscanf(fp,"%d %d",&n,&m);// take n,m
    
    return 1;


bool allDone(int n)

    bool returnBool=true;
    int i;
    for(i=0;i<n;i++)
    
        returnBool = returnBool && done[i];
    
    return returnBool;



bool donePrereq(int p,int n)

    bool returnBool=true;
    int i,j;
    for(i=0;i<p;i++)
    
        for(j=0;j<n;j++)
        
            if(strcmp(prereqIdentifier[i][j],courseIdentifier[j]) ==0 )
            
                printf("prereq matched\n");
                returnBool = (returnBool&&done[j]);
            
        
    
    return returnBool;

【问题讨论】:

请考虑更改问题标题。 @Oak 我认为现在这是否是家庭作业并不重要。这个问题相当清楚,并且发布的代码表明 O/P 在发布到这里之前已经做出了合理的努力来解决他们的问题。 如果您看到的只是“它没有产生输出”,那么您需要更多信息。如果您精通调试器,请将一个调试器连接到您的代码,然后逐步调试。除此之外,还有一个更丑但更简单的解决方案——在你的代码中添加很多 printfs。具体来说,将它添加到程序流程可能发生变化的任何地方(即ifforwhileswitch 语句),以及每个函数的开头和结尾。您可以打印出感兴趣的变量或仅打印数字 - 向您展示程序流程。这可能会帮助您找到问题,或者至少向我们提供更多详细信息以帮助您。 请不要编写/发布带有注释行的代码,例如//while(count&lt;=m)。它只会给你的帖子增加混乱。另外,你不简洁。您只需将整个程序交给我们并要求我们对其进行调试。你付多少钱? 您能否将其提炼为您遇到的问题的简明示例? 【参考方案1】:

当您在此处扫描输入以获取有关每个所提供课程的信息时:

        fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered,&p);

&amp;semOffered 参数不正确。您需要提供指向char 的指针。由于semOfferedchar 的数组,您可能打算将其存储到索引位置:

        fscanf(fp,"%s %c %d",courseIdentifier[i],&semOffered[i],&p);

这不会修复您的程序,但它确实允许程序完成。

【讨论】:

以上是关于应用回溯算法寻找毕业的最小学期数的主要内容,如果未能解决你的问题,请参考以下文章

优化回溯算法求解数独

从零开始学回溯算法

信息学赛培 | 08 不可不知的搜索与回溯——深度优先搜索算法与实例详解

JS 最小到目前为止回溯算法错误

这种寻找排列的回溯算法的时间复杂度是多少?

分支回溯DFSBFS贪心算法二分查找